Tighter Ruby Methods with Functional-style Pattern Matching, Using the Case Gem 148

Posted by Dean Wampler Tue, 17 Mar 2009 00:59:00 GMT

Ruby doesn’t have overloaded methods, which are methods with the same name, but different signatures when you consider the argument lists and return values. This would be somewhat challenging to support in a dynamic language with very flexible options for method argument handling.

You can “simulate” overloading by parsing the argument list and taking different paths of execution based on the structure you find. This post discusses how pattern matching, a hallmark of functional programming, gives you powerful options.

First, let’s look at a typical example that handles the arguments in an ad hoc fashion. Consider the following Person class. You can pass three arguments to the initializer, the first_name, the last_name, and the age. Or, you can pass a hash using the keys :first_name, :last_name, and :age.


require "rubygems" 
require "spec" 

class Person
  attr_reader :first_name, :last_name, :age
  def initialize *args
    arg = args[0]
    if arg.kind_of? Hash       # 1
      @first_name = arg[:first_name]
      @last_name  = arg[:last_name]
      @age        = arg[:age]
    else
      @first_name = args[0]
      @last_name  = args[1]
      @age        = args[2]
    end
  end
end

describe "Person#initialize" do 
  it "should accept a hash with key-value pairs for the attributes" do
    person = Person.new :first_name => "Dean", :last_name => "Wampler", :age => 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should accept a first name, last name, and age arguments" do
    person = Person.new "Dean", "Wampler", 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
end

The condition on the # 1 comment line checks to see if the first argument is a Hash. If so, the attribute’s values are extracted from it. Otherwise, it is assumed that three arguments were specified in a particular order. They are passed to #initialize in a three-element array. The two rspec examples exercise these behaviors. For simplicity, we ignore some more general cases, as well as error handling.

Another approach that is more flexible is to use duck typing, instead. For example, we could replace the line with the # 1 comment with this line:


if arg.respond_to? :has_key?

There aren’t many objects that respond to #has_key?, so we’re highly confident that we can use [symbol] to extract the values from the hash.

This implementation is fairly straightforward. You’ve probably written code like this yourself. However, it could get complicated for more involved cases.

Pattern Matching, a Functional Programming Approach

Most programming languages today have switch or case statements of some sort and most have support for regular expression matching. However, in functional programming languages, pattern matching is so important and pervasive that these languages offer very powerful and convenient support for pattern matching.

Fortunately, we can get powerful pattern matching, typical of functional languages, in Ruby using the Case gem that is part of the MenTaLguY’s Omnibus Concurrency library. Omnibus provides support for the hot Actor model of concurrency, which Erlang has made famous. However, it would be a shame to restrict the use of the Case gem to parsing Actor messages. It’s much more general purpose than that.

Let’s rework our example using the Case gem.


require "rubygems" 
require "spec" 
require "case" 

class Person
  attr_reader :first_name, :last_name, :age
  def initialize *args
    case args
    when Case[Hash]       # 1
      arg = args[0]
      @first_name = arg[:first_name]
      @last_name  = arg[:last_name]
      @age        = arg[:age]
    else
      @first_name = args[0]
      @last_name  = args[1]
      @age        = args[2]
    end
  end
end

describe "Person#initialize" do 
  it "should accept a first name, last name, and age arguments" do
    person = Person.new "Dean", "Wampler", 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should accept a has with :first_name => fn, :last_name => ln, and :age => age" do
    person = Person.new :first_name => "Dean", :last_name => "Wampler", :age => 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
end

We require the case gem, which puts the #=== method on steroids. In the when statement in #initialize, the expression when Case[Hash] matches on a one-element array where the element is a Hash. We extract the key-value pairs as before. The else clause assumes we have an array for the arguments.

So far, this is isn’t very impressive, but all we did was to reproduce the original behavior. Let’s extend the example to really exploit some of the neat features of the Case gem’s pattern matching. First, let’s narrow the allowed array values.


require "rubygems" 
require "spec" 
require "case" 

class Person
  attr_reader :first_name, :last_name, :age
  def initialize *args
    case args
    when Case[Hash]       # 1
      arg = args[0]
      @first_name = arg[:first_name]
      @last_name  = arg[:last_name]
      @age        = arg[:age]
    when Case[String, String, Integer]
      @first_name = args[0]
      @last_name  = args[1]
      @age        = args[2]
    else
      raise "Invalid arguments: #{args}" 
    end
  end
end

describe "Person#initialize" do 
  it "should accept a first name, last name, and age arguments" do
    person = Person.new "Dean", "Wampler", 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should accept a has with :first_name => fn, :last_name => ln, and :age => age" do
    person = Person.new :first_name => "Dean", :last_name => "Wampler", :age => 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should not accept an array unless it is a [String, String, Integer]" do
    lambda { person = Person.new "Dean", "Wampler", "39" }.should raise_error(Exception)
  end
end

The new expression when Case[String, String, Integer] only matches a three-element array where the first two arguments are strings and the third argument is an integer, which are the types we want. If you use an array with a different number of arguments or the arguments have different types, this when clause won’t match. Instead, you’ll get the default else clause, which raises an exception. We added another rspec example to test this condition, where the user’s age was specified as a string instead of as an integer. Of course, you could decide to attempt a conversion of this argument, to make your code more “forgiving” of user mistakes.

Similarly, what happens if the method supports default values some of the parameters. As written, we can’t support that option, but let’s look at a slight variation of Person#initialize, where a hash of values is not supported, to see what would happen.


require "rubygems" 
require "spec" 
require "case" 

class Person
  attr_reader :first_name, :last_name, :age
  def initialize first_name = "Bob", last_name = "Martin", age = 29
    case [first_name, last_name, age]
    when Case[String, String, Integer]
      @first_name = first_name
      @last_name  = last_name
      @age        = age
    else
      raise "Invalid arguments: #{first_name}, #{last_name}, #{age}" 
    end
  end
end

def check person, expected_fn, expected_ln, expected_age
  person.first_name.should == expected_fn
  person.last_name.should  == expected_ln
  person.age.should        == expected_age
end

describe "Person#initialize" do 
  it "should require a first name (string), last name (string), and age (integer) arguments" do
    person = Person.new "Dean", "Wampler", 39
    check person, "Dean", "Wampler", 39
  end
  it "should accept the defaults for all parameters" do
    person = Person.new
    check person, "Bob", "Martin", 29
  end
  it "should accept the defaults for the last name and age parameters" do
    person = Person.new "Dean" 
    check person, "Dean", "Martin", 29
  end
  it "should accept the defaults for the age parameter" do
    person = Person.new "Dean", "Wampler" 
    check person, "Dean", "Wampler", 29
  end
  it "should not accept the first name as a symbol" do
    lambda { person = Person.new :Dean, "Wampler", "39" }.should raise_error(Exception)
  end
  it "should not accept the last name as a symbol" do
  end
  it "should not accept the age as a string" do
    lambda { person = Person.new "Dean", "Wampler", "39" }.should raise_error(Exception)
  end
end

We match on all three arguments as an array, asserting they are of the correct type. As you might expect, #initialize always gets three parameters passed to it, including when default values are used.

Let’s return to our original example, where the object can be constructed with a hash or a list of arguments. There are two more things (at least …) that we can do. First, we’re not yet validating the types of the values in the hash. Second, we can use the Case gem to impose constraints on the values, such as requiring non-empty name strings and a positive age.


require "rubygems" 
require "spec" 
require "case" 

class Person
  attr_reader :first_name, :last_name, :age
  def initialize *args
    case args
    when Case[Hash]
      arg = args[0]
      @first_name = arg[:first_name]
      @last_name  = arg[:last_name]
      @age        = arg[:age]
    when Case[String, String, Integer]
      @first_name = args[0]
      @last_name  = args[1]
      @age        = args[2]
    else
      raise "Invalid arguments: #{args}" 
    end
    validate_name @first_name, "first_name" 
    validate_name @last_name, "last_name" 
    validate_age
  end

  protected

  def validate_name name, field_name
    case name
    when Case::All[String, Case.guard {|s| s.length > 0 }]
    else
      raise "Invalid #{field_name}: #{first_name}" 
    end
  end

  def validate_age
    case @age
    when Case::All[Integer, Case.guard {|n| n > 0 }]
    else
      raise "Invalid age: #{@age}" 
    end
  end
end

describe "Person#initialize" do 
  it "should accept a first name, last name, and age arguments" do
    person = Person.new "Dean", "Wampler", 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should accept a has with :first_name => fn, :last_name => ln, and :age => age" do
    person = Person.new :first_name => "Dean", :last_name => "Wampler", :age => 39
    person.first_name.should == "Dean" 
    person.last_name.should  == "Wampler" 
    person.age.should        == 39
  end
  it "should not accept an array unless it is a [String, String, Integer]" do
    lambda { person = Person.new "Dean", "Wampler", "39" }.should raise_error(Exception)
  end
  it "should not accept a first name that is a zero-length string" do
    lambda { person = Person.new "", "Wampler", 39 }.should raise_error(Exception)
  end    
  it "should not accept a first name that is not a string" do
    lambda { person = Person.new :Dean, "Wampler", 39 }.should raise_error(Exception)
  end    
  it "should not accept a last name that is a zero-length string" do
    lambda { person = Person.new "Dean", "", 39 }.should raise_error(Exception)
  end    
  it "should not accept a last name that is not a string" do
    lambda { person = Person.new :Dean, :Wampler, 39 }.should raise_error(Exception)
  end    
  it "should not accept an age that is less than or equal to zero" do
    lambda { person = Person.new "Dean", "Wampler", -1 }.should raise_error(Exception)
    lambda { person = Person.new "Dean", "Wampler", 0 }.should raise_error(Exception)
  end    
  it "should not accept an age that is not an integer" do
    lambda { person = Person.new :Dean, :Wampler, "39" }.should raise_error(Exception)
  end    
end

We have added validate_name and validate_age methods that are invoked at the end of #initialize. In validate_name, the one when clause requires “all” the conditions to be true, that the name is a string and that it has a non-zero length. Similarly, validate_age has a when clause that requires age to be a positive integer.

Final Thoughts

So, how valuable is this? The code is certainly longer, but it specifies and enforces expected behavior more precisely. The rspec examples verify the enforcement. It smells a little of static typing, which is good or bad, depending on your point of view. ;)

Personally, I think the conditional checks are a good way to add robustness in small ways to libraries that will grow and evolve for a long time. The checks document the required behavior for code readers, like new team members, but of course, they should really get that information from the tests. ;) (However, it would be nice to extract the information into the rdocs.)

For small, short-lived projects, I might not worry about the conditional checks as much (but how many times have those “short-lived projects” refused to die?).

You can read more about Omnibus and Case in this InfoQ interview with MenTaLguY. I didn’t discuss using the Actor model of concurrency, for which these gems were designed. For an example of Actors using Omnibus, see my Better Ruby through Functional Programming presentation or the Confreak’s video of an earlier version of the presentation I gave at last year’s RubyConf.

Comments

Leave a response

  1. Avatar
    Renzo 1 day later:

    Interesting mix of functional behavior with Ruby. Thanks for the article. I was thinking that the “real” override would be to have methods with the same name declared with a Case regexp as part of the declaration or parameter passing, for example: def initialize(Case[Hash]) and def initialize(Case[String, String, Integer]) and what is actually called is known only at runtime. based on parameters matching, like in functional world.

  2. Avatar
    Nate Murray 7 days later:

    You may also find Dan Yoder’s Functor of interest. It’s used in the Waves web framework.

    For instance:

    class View
      include Functor::Method
      def initialize( response ) ; @response = response ; end
      functor( :render, String ) { |s| @response.write(s) }
      functor( :render, Proc ) { |p| render( p.call ) }
      functor( :render, Object ) { |k| render( k.to_s ) }
      functor( :render, Object, Hash ) { |k,h| @response.headers.merge!( h ); render(k) }
    end
    
  3. Avatar
    Dean Wampler 7 days later:

    @Nate. Very interesting. Thanks for the link!

  4. Avatar
    Dhananjay Nene 7 days later:

    How about a function dispatch based mechansim. Including code below in python (I am not up the curve enough to stick my neck out in this conversation using ruby yet). I believe it should be feasible to have a similar ruby version as well. Haven’t implemented parameter defaulting logic, though that could get added. Using an array of functions does seem more fp’ish, idiomatic and cleanly segmented code to me though other opinions could vary.

    check_dict = lambda x : isinstance(x[0],dict)
    check_sequence = lambda x : hasattr(x[0],'__iter__')
    check_args = lambda x : len(x) > 1
    
    class Person(object):
        def initialise_from_dict(self,hash):
            self.first_name = hash['first_name']
            self.last_name = hash['last_name']
            self.age = hash['age']
        def initialise_from_sequence(self,seq):
            self.first_name = seq[0]
            self.last_name = seq[1]
            self.age = seq[2]
        def initialise_from_args(self,first_name,last_name,age):
            self.first_name = first_name
            self.last_name = last_name
            self.age = age
        dispatch_data =((check_dict,False,initialise_from_dict),
                        (check_sequence,False,initialise_from_sequence),
                        (check_args,True,initialise_from_sequence))
        def __init__(self,*args):
            for check, explode_args, init in self.dispatch_data :
                if check(args) :
                    if explode_args :
                        init(self,args)
                    else :
                        init(self,*args)
                    break
        def __str__(self):
            return "%s %s(%s)" % (self.first_name,self.last_name,self.age)
    
    print Person({'first_name':'Bob', 'last_name' : 'Martin', 'age' : 29})
    print Person(['Dean','Wampler',39])
    print Person('John','Doe',35)
    
    
  5. Avatar
    Dhananjay Nene 7 days later:

    Worked on the ruby code too. Though both the methods and the hash are declared within the object (for the simple reason that I still don’t know how to use the same outside the object scope).

    Here’s the ruby code (please grant me some novice liberties)
    class Person
      attr_reader :first_name, :last_name, :age
    
      def is_array?(x)
        x.length == 1 and x[0].is_a?(Array)
      end
    
      def is_hash?(x)
        x.length == 1 and x[0].is_a?(Hash)  
      end
    
      def is_args?(x)
        x.length > 1 and x[0].is_a?(String)  
      end
    
      def initialize *args
        func_hash = {
          self.method(:is_array?) =>self.method(:init_with_array),
          self.method(:is_hash?) => self.method(:init_with_dict),
          self.method(:is_args?) => self.method(:init_with_args)
      }
          for check,func in func_hash do
            if check.call(args)
              func.call(args)
              break
            end
          end
      end
    
      def init_with_array(args)
          @first_name = args[0][0]
          @last_name = args[0][1]
          @age = args[0][2] 
      end
    
      def init_with_dict(args)
          @first_name = args[0]['first_name']
          @last_name = args[0]['last_name']
          @age = args[0]['age']
      end
    
      def init_with_args(args)
          @first_name = args[0]
          @last_name = args[1]
          @age = args[2]   
      end
    
      def to_s()
          @first_name + " " + @last_name + "(" + @age.to_s() + ")"    
      end
    
    end
    
    p Person.new(['John', 'Doe',35]).to_s()
    p Person.new({'first_name'=>'bob', 'last_name' => 'martin', 'age' =>  29}).to_s()
    p Person.new('dean','wampler',39).to_s()
    
    And referring to the python code I submitted earlier .. it was a bit broken. Here’s the correct version :
    check_dict = lambda x : isinstance(x[0],dict)
    check_sequence = lambda x : hasattr(x[0],'__iter__')
    check_args = lambda x : len(x) > 1
    
    class Person(object):
        def initialise_from_dict(self,hash):
            self.first_name = hash['first_name']
            self.last_name = hash['last_name']
            self.age = hash['age']
        def initialise_from_sequence(self,seq):
            self.first_name = seq[0]
            self.last_name = seq[1]
            self.age = seq[2]
        def initialise_from_args(self,first_name,last_name,age):
            self.first_name = first_name
            self.last_name = last_name
            self.age = age
        dispatch_data =((check_dict,initialise_from_dict),
                        (check_sequence,initialise_from_sequence),
                        (check_args,initialise_from_args))
        def __init__(self,*args):
            for check, init in self.dispatch_data :
                if check(args) :
                    init(self,*args)
                    break
        def __str__(self):
            return "%s %s(%s)" % (self.first_name,self.last_name,self.age)
    
    print Person({'first_name':'Bob', 'last_name' : 'Martin', 'age' : 29})
    print Person(['Dean','Wampler',39])
    print Person('John','Doe',35)
    ~                                 
    
  6. Avatar
    okey oyunu indir about 1 year later:

    ?nteresting post. Thanks for the link.

  7. Avatar
    cheap vps about 1 year later:

    cheap VPS

  8. Avatar
    Indonesian Teak Furniture: Indoor Teak Furniture, Teak Garden Furniture, Teak Table, Teak Chairs about 1 year later:

    Thank you a lot for information! I didn`t know about it.

  9. Avatar
    oxpdffr about 1 year later:

    Word en PDF Convertisseur est un bon aide dans votre travail, il est utilisé comme une imprimante virtuelle et supporte convertir tous les formats qui peuvent être imprimable en document PDF. Si vous avez d’autres besoins, ce convertisseur contient huit formats de sortie : PS, EPS, PDF, PNG, JPEG, BMP, PCX, et TIFF, vous pouvez convertir vos fichiers en ces formats. Télécharger gratuitement Word en PDF Convertisseur et prendre un essai.

  10. Avatar
    Designer Bags about 1 year later:

    Thanks for nice sharing!!It help me a lot with those information.

  11. Avatar
    chanel store about 1 year later:

    I hope to leave my comments here. Thank you

  12. Avatar
    iPod to iTunes Transfer about 1 year later:

    iPod to iTunes Transfer, transfer iPod to iTunes library, is an all-function transfer for iPod users that supports all versions of iPod and other iPhone devices. It can perform like a transfer, a converter, a ringmaker. You can free download it and have a try !

  13. Avatar
    shopping about 1 year later:

    Moncler is the renowned high-end outerwear Discount Moncler brand which created a quilted jacket trend in the fashion world. Never one to stand still in time,It has always kept abreast of the latest Moncler Jackets technologies and stayed true to its origins without compromising its Moncler runway worthy style. If it has a Moncler tag, it will keep you warm on top of the highest mountain and be Moncler Men’s trendy on any city street.Features the latest selection of the north face clothing. You will enjoy what you Moncler Women’s show you. As well we offer you the good shopping experience with cheap and discount price.

  14. Avatar
    shopping about 1 year later:

    Hermes Birkin Handbags are fashion icons regarded Hermes Handbags as much more than simple purses. They are status symbols, with waitlists forcing fashion fans to wait more than Hermes Birkin two years to own one.Hermes Birkin Handbags were created by Hermes head Jean Louis Dumas and actress Jane Birkin. Word is that Jean wanted a functional weekend bag, and so the Birkin was born. Now these Hermes Belts prestigious bags are seen on the arms of all the hottest celebs including Hermes Purses Victoria Beckham, Sarah Jessica Parker, and Oprah Winfrey.

  15. Avatar
    shopping about 1 year later:

    Herve Leger Bandage High Waist Mini Skirts It is very eye-catching. You can wear Discount Herve Leger it in your casual time,go to office, go shopping, as you like in every place. As we know ,Herve Leger Dresses comes from French ,and found in 1985,it is the most famous designer house ,it always go in for the women’s beautiful shaped 90% Rayon, 9% Nylon,1% Spandex Zipper Herve Leger Dresses closure please just follow the show on the label to maintain the beauty Dry clean only These designer Herve Leger Bandage Dress and Herve Leger Skirts are feminine and sensual,stand out.

  16. Avatar
    shopping about 1 year later:

    There is a brand that continues to turn out the Hermes Birkin seasons to seasons, yes, there is Hermes Handbags. In this season, there is bright colors. The hermes birkin replica,Birkin HandBags,hermes birkin purses are all in our warehouse.The Replica Hermes Birkin makes an effort to please the all Hermes 35CM Birkin Bags request by the masses. When you first come across with the Replica Hermes Belts the showroom, you instantly think that it is a Replica Hermes Birkin you would love to tote.

  17. Avatar
    shopping about 1 year later:

    Beginning as a professional Cheap Moncler Coats seller, We achieved great success in this field. Moncler Giubbotti have a pretty good team who have been devoting themselves into reducing the costs by constantly Moncler Uomo looking for a best and steadiest manufacturer.By the year 2006, we had expanded our line from Moncler Gilet Donna to a wider range, They are Moncler Outlet,Moncler Boots,Moncler Scarf,Moncler Giubbotto Uomo. From Outletmoncler.com,People all over the world enjoy buying stuff and give high praises.

  18. Avatar
    shopping about 1 year later:

    To have the Hermes birkin bag is becoming every woman’s dream.Though they have a hilarious collections of Replica hermes birkin,and others feminine accessories,but only few women are able to obtain it,because Cheap hermes handbags of the price,Since that it designed by the would’s most known designer,then the price reaches more ther hundreds Hermes Belts dollars for an item. If you are in such problem,loving the handbags,but have limited fund that Hermes Purses are far away from it’s price,then Replica Hermes Bags would your best solution.

  19. Avatar
    Backup iPhone SMS about 1 year later:

    In fact, you know. the contacts and SMS have more values than an iphone’s own value. You can spend money to buy a new iPhone, However, if you get your SMS and contacts lost, it is hard to retrieve them. So it is very very important for you to backup iPhone SMS and contacts to computer regularly.

  20. Avatar
    Pandora about 1 year later:

    It is my favorite patter name (not favorite pattern, just name).

  21. Avatar
    iPhone contacts backup about 1 year later:

    You know, it is not to understand it, however, you can finish it, enjoy much.

  22. Avatar
    DVDtoiPad about 1 year later:

    How to be a good prgrommer, come to here and study. You know.

  23. Avatar
    iPad ePub transfer about 1 year later:

    Code everyday, for our progress, how to be a good programmer, here how can we?

  24. Avatar
    china shoes about 1 year later:

    the Earth is superimposed onto the motion of the rest of the planets. In this simulation you are riding on the Sun,www.lightinthehandbags.com and large planets make the Sun wobble. www.heyheytrade.com

  25. Avatar
    www.heyheytrade.com about 1 year later:

    You know, it is not to understand it, however, you can finish it, enjoy much.www.lightinthehandbags.com www.hotshoesshop.com

  26. Avatar
    Hawaii Daycare Form about 1 year later:

    Your post will be rather good, and I’m sure some will find it interesting because it’s about a topic that’s as widely discussed as others. Some may even find it useful. I have learned a significant amount of useful information from your post. Thanks so much for your post. Keep sharing.

    Hawaii Daycare Form

  27. Avatar
    michael van der ham about 1 year later:

    this is really awesome thank you so much michael van der ham

  28. Avatar
    michael van der ham about 1 year later:

    this discussion is a great post..thanks a lot! michael van der ham

  29. Avatar
    dvdsoft about 1 year later:

    With the right tool, you can easily burn mp4 to dvd and itunes to dvd. Also, you can use drm removal tool to remove drm protection from itunes, zune, amazon legally. wmv to dvd, mov to dvd, mp4 to dvd, itunes to dvd

  30. Avatar
    http://www.blacktowhiteiphone4.com about 1 year later:

    I love iphone 4 white, and i will keep focus on it. But when will it really release, hmm let’s see.

  31. Avatar
    Silicone Molding about 1 year later:

    Mold making is the core business of Intertech (Taiwan). With world level technology, Intertech enjoys a very good reputation for making Injection Mold and Plastic Moldsfor their worldwide customers.

  32. Avatar
    ssara about 1 year later:

    The concept is very nicely crated. It will absolutely make work completed easily. child care

  33. Avatar
    Karen about 1 year later:

    I am Ruby beginner so your step by step guide was very useful to me

  34. Avatar
    Truth About Quickness Review about 1 year later:

    Your post will be rather good, and I’m sure some will find it interesting because it’s about a topic that’s as widely discussed as others. Some may even find it useful. I have learned a significant amount of useful information from your post. Thanks so much for your post. Keep sharing.

  35. Avatar
    Criminal Check about 1 year later:

    This is a nice tutorial. Thanks for sharing this to us.

  36. Avatar
    accounting services about 1 year later:

    Your post will be rather good, and I’m sure some will find it interesting because it’s about a topic that’s as widely discussed as others. Some may even find it useful.accounting services

  37. Avatar
    US Criminal Record about 1 year later:

    It’s much more general purpose than that.

  38. Avatar
    Server management about 1 year later:

    An awful writer. Real inoformative and precise. I apprize the communicator for presenting such a alter displace. This types of posts are always bookmarkable. I’ll inactivity for specified posts here all the experience. Server management

  39. Avatar
    ssara about 1 year later:

    The concept is nice but yet need to be more explicit. Well anyway thanks for sharing your thoughts. oatmeal cookies

  40. Avatar
    Server management about 1 year later:

    An impressive send. Real informative and overnice. I apprise the communicator for presenting specified a unresponsive airman. This types of posts are e’er bookmarkable. I’ll act for specified posts here all the reading.

  41. Avatar
    Server management about 1 year later:

    An awesome line. Real inoformative and respectable. I apprize the author for presenting much a cool move. This types of posts are always bookmarkable. I’ll move for such posts here all the example. Server management

  42. Avatar
    Criminal Check about 1 year later:

    Nice article to read. Thanks for sharing this to us.

  43. Avatar
    facebook dating app about 1 year later:

    The purpose of the website is often great for my students. A lot of wonderful options are no cost in right here. At first, I have launched your site to my college students in my course, so don’t be confused in case your internet site hits are increase substantially. facebook dating app

  44. Avatar
    online rn to bsn program about 1 year later:

    Many people are actually convinced that the debt settlement agencies are a godsend and something that will definitely help them . thank you for your note http://onlinenursing.fhchs.edu

  45. Avatar
    Kansas Mortgage Modification about 1 year later:

    There is little to no help for anyone who is in debt. If you don’t deal with your debt immediately then you will face greater, unmanagable debts. http://www.loan-modification.net/kansas

  46. Avatar
    Affitti Appartamenti Bucarest about 1 year later:

    Interesting mix of functional behavior with Ruby. Thanks for the article.

  47. Avatar
    ssara about 1 year later:

    Wow. Great concept. The information will help a lot. Louisiana Daycare Forms

  48. Avatar
    Foreclosure Proces about 1 year later:

    That’s when Marshall became my best friend. With his usual Faulknerian flourish and his deep Baptist baritone, he exclaimed: ‘We’re at the front you fucking idiot!”http://www.foreclosureprocess.org

  49. Avatar
    Daycare Forms about 1 year later:

    In the good old days, before Mac OS X 10.3 was released, developers had to write quite a bit of code for each of these layers in order to develop a Cocoa application. Beginning in Panther, Apple started to introduce frameworks to help out with a lot of the more repetitive parts of MVC. http://www.daycareforms.org

  50. Avatar
    belstaff jackets about 1 year later:

    good post and thanks for share with us

  51. Avatar
    Criminal Records about 1 year later:

    So far, this is isn’t very impressive, but all we did was to reproduce the original behavior.

  52. Avatar
    child care job about 1 year later:

    Anarchists may be fellow travelers with us libertarians in the sense that they want to cooperate with our efforts to dramatically reduce the size of government, but where we part company is in their desire to eliminate the state altogether.http://www.ownadaycare.com/jobs

  53. Avatar
    dvdsoft about 1 year later:

    With the right tool, you can easily burn mp4 to dvd and itunes to dvd. Also, you can use drm removal tool to remove drm protection from itunes, zune, amazon legally. wmv to dvd, mov to dvd, convert mp4 to dvd, itunes to dvd

  54. Avatar
    Daycare Grants in Mississippi about 1 year later:

    It is vital for this Commonwealth to have two voices speaking for the needs of its citizens and two votes in the Senate in the approximately five months between a vacancy and an election,” an ailing Ted Kennedy wrote the leaders of the Massachusetts General Court in a letter made public yesterday.http://daycaregrants.org/mississippi

  55. Avatar
    sprayway 848 about 1 year later:

    As we know ,Herve Leger Dresses comes from French ,and found in 1985,it is the most famous designer house ,it always go in for the women’s beautiful shaped 90% Rayon, 9% Nylon,1% Spandex Zipper Herve Leger Dresses closure please just follow the show on the label to maintain the beauty Dry clean only These designer Herve Leger Bandage Dress and Herve Leger Skirts are feminine and sensual,stand out.http://www.thejanitorialsupply.com/sprayway-848-industrial-plastic-cleaner.htm

  56. Avatar
    iPhone SMS to Mac Backup about 1 year later:

    Would you like to banckup iphone SMS to mac, macBook, macbookPro as .txt files? Now a software iphone SMS to Mac Backup can help you to realize it.

  57. Avatar
    day care jobs about 1 year later:

    Indeed, telling them that they make mistakes while correcting other’s errors, real or imagined, was the same as telling them that they have no right to claim any superiority. As you know the power of positive thinking (or delusion) can literally allow you to fly. And so my fellow (or is it fellas) were (was?) flying high (coke anyone?) when suddenly Queen Christina’s dart deflated their macho egos.http://www.ownadaycare.com/jobs

  58. Avatar
    Criminal Search about 1 year later:

    If you use an array with a different number of arguments or the arguments have different types, this when clause won’t match.

  59. Avatar
    Tenant Screening about 1 year later:

    This types of posts are always bookmarkable. I’ll move for such posts here all the example.

  60. Avatar
    Jones about 1 year later:

    4

  61. Avatar
    mosic about 1 year later:

    5

  62. Avatar
    Matteo about 1 year later:

    6

  63. Avatar
    Importance of education about 1 year later:

    But,we are putting money into your account, the debt settlement company is taking its fee out. Saving to try to settle one debt can take a year or more and since most people typically have multiple debts they want to try to settle the process can take three or four years.http://educationonlinenow.wordpress.com/2011/01/13/gettinganonlineeducationdegree

  64. Avatar
    Education is essential about 1 year later:

    It helped me with ocean of knowledge so I really believe you will do much better in the future I appreciate everything you have added to my knowledge base.Admiring the time and effort you put into your blog and detailed information you offer!http://educationonlinenow.wordpress.com/2011/01/13/earning-your-education-degree-online-is-easy-to-do

  65. Avatar
    cable ties about 1 year later:

    Your post is very good, and I’m sure some will find it interesting because it’s about a topic that’s as widely discussed as others.

  66. Avatar
    Backup iPhone SMS about 1 year later:

    I really like this essay.

  67. Avatar
    iPhone contacts backup for Mac about 1 year later:

    Thank you for writing it so seriously.

  68. Avatar
    dswehfhh about 1 year later:

    We are the professional t-shirts manufacturer. t-shirts supplier. t-shirts factory, custom t-shirts.

  69. Avatar
    Sunglass about 1 year later:

    Inspired ,MEN designer Sunglasses

  70. Avatar
    how to grow magic mushroom about 1 year later:

    It is not the role of government to interfere with voluntary agreements. It is the role of limited government in a free society to enforce those agreements.

  71. Avatar
    Ejaculation By Command Review over 2 years later:

    I guess i just have to say it. i love your work! I can’t wait for

    episode 9! i’ve tabbed and subscribed nearly everywhere so i can see it

    soon as it comes out. love that it’s told from the healers point of view

    and that sadly enough it’s so close to my life.

    Ejaculation By Command Review

  72. Avatar
    dory over 2 years later:

    The blog was absolutely fantastic! Lots of great information and inspiration, both of which we all need. thank you so much.Keep up the good works. Social Network

  73. Avatar
    Big pony over 2 years later:

    I like what you have said,it is really helpful to me,thanks!

  74. Avatar
    Nebraska Daycare Forms over 2 years later:

    After being intubated from August to October, the docs finally brought up the idea of a trach. http://www.daycareforms.org/nebraska

  75. Avatar
    haris4242 over 2 years later:

    My friend recommended going through this blog and I am impressed. It has a superb collection of contents. The relevancy and credibility of information is the major issue. The decoration was nice. I want to spend some time here on daily basis Seating

    New and Used Office Desks and Chairs

    Commercial Office Furniture Denver

    Denver Office Furniture

  76. Avatar
    okey oyunu oyna over 2 years later:

    great code

    internette görüntülü olarak okey oyunu oyna, gerçek kisilerle tanis, turnuva heyecanini yasa.

  77. Avatar
    section-8-prejudice-crack over 2 years later:

    Thanks great post and code/ I use him in my blog!!!

  78. Avatar
    sandbag training over 2 years later:

    Outstanding read, I just passed this onto a colleague who was doing a little research on that. And he actually bought me lunch because I found it for him smile So let me rephrase that: Thanks for lunch!

    sandbag training

  79. Avatar
    sandbag training over 2 years later:

    That’s quite incredible. I have gained well of bit of knowledge here. You have created a fabulous template. I read this blog every day and it surely makes my day. Hope you will come up with more new items.http://sandbag-training.com

  80. Avatar
    marihuany nasiona over 2 years later:

    If you have a life story Events that occur as a result …. love The (five) ... Love Ya to navigate. Another view is the one that you should have read Then you will get more than you think.http://www.magicznemuchomory.pl

  81. Avatar
    cheap brand watches over 2 years later:

    It is really a nice post, it is always great reading such posts, this post is good in regards of both knowledge as well as information. Very fascinating read, thanks for sharing this post here.

  82. Avatar
    coach purses over 2 years later:

    Mr Coates coach purses is the longest U.S. market popular with one of the most successful leather brand. Mr Coates coach purses store represents the most admirable American fashion innovative style and traditional skills . Mr Coates coach bags have durable quality and exquisite technology, Conspicuous Coach Heels in the female consumers have good reputation. Welcome to our shop Elegant Coach Purses

  83. Avatar
    ford leveling kit over 2 years later:

    I want to read more blogs from this site Thank you :-)

  84. Avatar
    leveling kit ford over 2 years later:

    Thank you for your informative article :-)

  85. Avatar
    leveling kit f250 over 2 years later:

    I really love to read your blogs Thank you :-)

  86. Avatar
    f350 leveling kit over 2 years later:

    I really love your blogs. Thank you :-)

  87. Avatar
    red pumps over 2 years later:

    Do you like the Red Pumps? They are very popular in the young friends, because they have different styles. We are Red Heels and Red Shoes providers. We can give you the cheapest price and the best service, and do you want to join us at once?

  88. Avatar
    p90x over 2 years later:

    The answer is Michael Jordan. “By acclamation, Michael Jordan is the greatest basketball player of all time.”

  89. Avatar
    [url=http://www.lightingstyles.co.uk/Kitchen-Lighting.htm]lighting your kitchen[/url] over 2 years later:

    Your homepage caught my attention. It is really easy for the eyes. There is not a great deal of posts. But the information already posted are quite handy. I appreciate your work.

  90. Avatar
    Jewellery over 2 years later:

    Online UK costume and fashion jewellery shop with,

  91. Avatar
    rajasthan tour packages over 2 years later:

    rajasthan tour packages has been successfully handling groups and individual travellers from Europe & the USA for last more than ten years, with the help of a well co-coordinated network of experienced associate offices throughout India & abroad.

  92. Avatar
    beats by dr dre headphones over 2 years later:

    Some beats by dr dre solo purple training routines that will improve Your Voice instantly when you exercise Them!These training routines are extremely effective at erasing bad habits, and replacing them using a “successful”, fabulous sounding voice. The headphone’s exterior is produced from an ultra glossy complete that’s particular to garner some attention in monster beats dr dre headphones.

  93. Avatar
    VCP-410 over 2 years later:

    You will cover every field and category in Other VMware Certification helping to ready you for your successful VMware Certification. VCP-410 test Updated in May 2011.

  94. Avatar
    hcg diet atlanta over 2 years later:

    I really spend enjoyable time here in you blog. It provides me with relevant information about the topic I have been studying. Your last several posts really make me love this blog. I would love to make some posts in the discussion board. Nice work. hcg diet atlanta

  95. Avatar
    stump removal Houston over 2 years later:

    I am totally impressed. The articles have pure clarity. You have great command over this issue. A blog can’t be better than this. Thanks a great deal. stump removal Houston

  96. Avatar
    reviews of provillus over 2 years later:

    hmm ,i’m not sure if this is what i’m looking for but anyway this is interresting and could be useful some day,thanks for taking time to write such cool stuff

  97. Avatar
    mp3 converter over 2 years later:

    Good Information Very nice post.

  98. Avatar
    north india tour packages over 2 years later:

    I am happy to find so many useful information here in the post, thanks for sharing it here. I hope you will adding more.

  99. Avatar
    Lowest whole network over 2 years later:

    http://www.capsroom.com/

  100. Avatar
    Diabetic Product Supply over 2 years later:

    Happy to see your blog as it is just what I’ve looking for and excited to read all the posts. I am looking forward to another great article from you. Thanks & Regards. James Thomas Healthcare Products Supplies

  101. Avatar
    Diabetic Product Supply over 2 years later:

    I happy to see your blog as it is just what I’ve looking for and excited to read all the posts. I am looking forward to another great article from you. Thanks & Regards. James Thomas Healthcare Products Supplies

  102. Avatar
    dentist in houston over 2 years later:

    This is an wonderful article which mentioned the important program code by using Tighter Ruby Methods .IT is really a helpful article. I like it so so.

  103. Avatar
    Crystal Jewellery over 2 years later:

    Great post! Nice and informative, I really enjoyed reading it and will certainly share this post with my friends . Learn everything about what is cubic zirconia

  104. Avatar
    onlyshox over 2 years later:

    Fantastic post. Your post was that great, keep it up.

  105. Avatar
    beats by dre store over 2 years later:

    I really enjoyed reading it and will certainly share this post with my friendshigh quality headphones new design headphones

  106. Avatar
    cheap beats by dre uk over 2 years later:

    good post

  107. Avatar
    dvd ripper over 2 years later:

    good post, i think so.Thank you!

  108. Avatar
    Uniformes De Fútbol over 3 years later:

    I really like your article. Please keep on writing excellent posts. To find out more please go to http://baratasfutbolcamiseta.es/ http://baratasfutbolcamiseta.es/category.php?id=9 http://baratasfutbolcamiseta.es/goods.php?id=76 http://www.camisetas-de-futbol.es/ http://www.camisetas-de-futbol.es/category-66-b0-FIFA+del+Copa+del+Mundo.html http://www.camisetas-de-futbol.es/goods-4080-10+11+Holland+Tercel+Blanco+camiseta+del+futbol.html http://www.camisetasfutbolchina.es/ http://www.camisetasfutbolchina.es/category-122-b0-Real+Madrid.html http://www.camisetasfutbolchina.es/goods-4605-11+12+England+Titular+Blando+camiseta+del+futbol.html

  109. Avatar
    christianlouboutin over 3 years later:

    All among us realise that if you MBT boots or shoes within get hold of, Jimmy Choo Sandaleseducation-women’ vertisements mbt tunisha providing may easily really encourages lymphatic circulation,Jimmy Choo Bottines you’ chemical in all probability more significant receive boots or shoes clearance retail store as a result of MBT while it a good number of at no cost submitting in combination with MBT boots or shoes are almost always pay for and also profit designed notnaxcanada goose outlet.

    A particular low-priced MBT Nama Boots and shoes out of a number of online space boots and shoes plus boot footwear MBT great bargains preferred now in now would be to simply and even safely mbt sandals pay for consumers pay for progressively more over the internetcanada goose jakke, have MBT footwear and remaining grown to be a sample. MBT boots providing now, ways to explain any one prevent
    the north face

    ? Brand-new assumed to test a person's MBT boots pay for, generate a test? My wife and i reassurance any one, we have a special working experience
    North Face Denali Jakker Kvinder hoodie

    .
  110. Avatar
    Evering2010 over 3 years later:

    Thank you for sharing them with us , I think it’s worth reading

  111. Avatar
    Ashley Bowling over 3 years later:

    Better late than never Better safe than sorry Better the Devil you know than the Devil you don’t

  112. Avatar
    ysbearing over 3 years later:

    Slewing bearing called slewing ring bearings, is a comprehensive load to bear a large bearing, can bear large axial, radial load and overturning moment.

  113. Avatar
    flac converter over 3 years later:

    Thank you for sharing, I’ll definitely dig deeper into it.

  114. Avatar
    vendita scarpe mbt over 3 years later:

    real a good post , i am very like it , will come back again

  115. Avatar
    Nike run free over 3 years later:

    Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog

  116. Avatar
    canada goose jakke over 3 years later:

    Very interseting , i make the remark of this blog , i will come back again . your blog is very interesting

  117. Avatar
    http://www.uggssale2011.com over 3 years later:

    UGG Stiefel günstig , dazu neigen schon mal jemand understandthat Regenwälder innerhalb der Rate in 6 entblößt werden , 000 Hektar pro Stunde Es sollte in der Tat eine überraschende Nachricht, dass unsere unerfahrenen Länder auf diese Art von schnellen Ebene abgeschafft werden eher sein, und führen die Menschen herauszufinden, was die schädlichen Auswirkungen ist in der Regel Nun, die Antwort oft Mischung auf yes plus no.Others können, sind überzeugt, dass die Prämisse, auf eine sterbende Welt gut gesagt, während andere Leute den Vorteil, dass solche Elemente könnte wirklich arise.However leugnen, in Fragen etwas wie dieses, haben die Menschen hat zu glauben, nur von einem Ding gewonnen, und das ist genau das: Regenwald Abholzung würde es über eine etwas höhere Geschwindigkeit und auch seine besondere schädliche Vorteile sind fast unstoppable.We Diskussion der Entwaldung jeden Tag noch wir nie bemerken es die schnelle Ankunft Tempo. Vielleicht ist es als Folge des Mannes fahrlässig, dass andere bestehen zu zerstören, ohne zu sehen Ihr Potential Ergebnisse ihrer dient könnte carry.Man kann nur wahrscheinlich bereuen, wenn die Dinge zu sein, die sie betreffen auf diese Weise dazu neigen, dass sie alle zu einem fabelhaften Störung so etwas wie ein guter Alltags living.By Beobachten und Sehen und Hören die wahrscheinlichen Ergebnisse in Entwaldung, muss eine haben Seiten im Inneren der Auswahl unter den guten und bösen.

  118. Avatar
    christian louboutin over 3 years later:

    Very interseting , i make the remark of this blog , i will come back again . your blog is very interesting

  119. Avatar
    beats by dr dre over 3 years later:

    A university studentbeats by dr dre caught by the enemy, the enemy tied him at the poles,just beats solo headphones purple and then asked him: say, where are you? You do not say it electrocuted! Scheap dr.dre beats studio headphones balck/yellowtudents back to the enemy a word, the result was electrocuted, he said: I am TVU.Hot sale beats by dr dre pro headphones

  120. Avatar
    beats by dr dre over 3 years later:

    A university studentbeats by dr dre caught by the enemy, the enemy tied him at the poles,just beats solo headphones purple and then asked him: say, where are you? You do not say it electrocuted! Scheap dr.dre beats studio headphones balck/yellowtudents back to the enemy a word, the result was electrocuted, he said: I am TVU.Hot sale beats by dr dre pro headphones

  121. Avatar
    Sac Gucci over 3 years later:

    Conception unique de la Sac Gucci est très sympa,Sac Gucci Soldes sont de qualité fiable et à prix raisonnable.Sac Gucci Pas Cher a été considéré comme un Gucci Soldes signe de tendances de la mode et des Gucci Sac a main sélection symbole de statut social,Gucci Soldes online sélectionnez en ligne un Gucci Pas Cher, facile d’avoir un Sac a Main Gucci Soldes 2011 populaire.Oui,désormais tomber en amour avec Sac Gucci Guccissima.

  122. Avatar
    tv guide over 3 years later:

    thanks alot. great stuff

  123. Avatar
    calcular peso ideal over 3 years later:

    What a nice piece of ruby code. Love Ruby and Dynamic languages

  124. Avatar
    dealers license over 3 years later:

    very nice blog i like it and wanna say thank you for sharing it here so keep it up man for your fellows

  125. Avatar
    http://www.jerseyscheapusa.com over 3 years later:

    cheapjerseysusa ,site http://www.jerseyscheapusa.com , offer cheap nfl jerseys and cheapjerseysusa .our mission is to gain a cheap jerseys sustainable competitive advantage by providing cheap jerseys customers the highest quality jerseys and cheapjerseysusa services. offering all the authentic cheap jerseys , cheap nfl jerseys ,nhl cheap nfl jerseys ,nba jerseys,mlb cheapjerseysusa ,” cheap jerseys Quantity first and customer foremost”is our jerseys top priority. We really hope to expand our cheapjerseysusa business and cheap nfl jerseys through cooperation with cheap jerseys individuals and companies from all over the world.

  126. Avatar
    toms shoes over 3 years later:

    You will find that toms shoes are comfortable to wear While you can get cheap toms at low price online. Maybe toms last chance shoes will be your favorite.

  127. Avatar
    backup iPhone sms over 3 years later:

    Basically Programming Scala is a general purpose programming language that integrates both features of object-oriented and functional languages.Your valuable information regarding its availability to get it more easily have made a comprehensive platform to get benefited after using this

  128. Avatar
    boat insurance rates over 3 years later:

    Thanks for sharing, useful codes, nice to learn more about it.

  129. Avatar
    lipozene over 3 years later:

    Your site always offer some really interesting information. Thank you for sharing it with us.

  130. Avatar
    Alimentação over 3 years later:

    Good Site! bear large axial, radial load and overturning moment.

  131. Avatar
    youngbrown over 3 years later:

    Thanks for the information, I’ll visit the site again to get update information action figures

  132. Avatar
    youngbrown over 3 years later:

    Thanks for the information, I’ll visit the site again to get update information action figures

  133. Avatar
    cheap snapback hats over 3 years later:

    Fashion Show in New York and were priced as amount on appeal the However, sleeping you able to compromise on quality, admirable Louboutin net site. These are accessible Louis Vuitton Totes now for an afire cost

  134. Avatar
    cheap snapbacks free shipping over 3 years later:

    Abandoned to paying.there exists particular proven fact that blame will your accretion a particular charm. complete deals on adapted items such for this Hurry in now to arrangement this counterbalanced.

  135. Avatar
    wholesale snapback hats over 3 years later:

    Usually This affluence of amazing items they acquire on bargain now.Christian Louboutin for Rodarte acicular heels brainwork about accomplished on besides Victoria Beckham on the Who Rocked Most babys will excited

  136. Avatar
    wholesale snapbacks over 3 years later:

    increments of abandoned to hour intervals. Sometimes their abutting beddy-bye clocks may alike be ashamed from some ones will probably in quite. accepting aural the womb, and so they afield ahead that night is evening.

  137. Avatar
    nfl cheap jerseys over 3 years later:

    This indicates that theyll blot added Other reaction can have is make them online store. of their time sleeping in the plan the day than evening, Cecilia Bell a added cast abecedary at the school, said the argument,

  138. Avatar
    air mens shoes over 3 years later:

    Bell adorable the belletrist of accepting, they went to February and they are alarm a response. in order to find bargain products easily. When choosing a budget products, The babble affronted and became complete,

  139. Avatar
    cheap air shoes over 3 years later:

    Although is because the items that are of So, all accepting were afire that these are buying. about the acclimatized you need to be sure that they just don’t compromise about the company’s goods aswell

  140. Avatar
    blank snapback hats over 3 years later:

    determination has to be made especially acclimatized the bulk tag of calm to them, and abreast abrogating challenge accompanying to. the poor which can be related to discount prices. Here is the nice your babys

  141. Avatar
    bladeless fans over 3 years later:

    Tighter Ruby Methods with Functional-style Pattern Matching, Using the Case Gem 140 good post94

  142. Avatar
    Rajasthan tour packages over 3 years later:

    Traveling in India is very beautiful so, we should have to go to travel to India and so my historical places and some more tourists places.

    Regards: Rajasthan tour packages

  143. Avatar
    louboutin sales over 3 years later:

    Tighter Ruby Methods with Functional-style Pattern Matching, Using the Case Gem 142 hoo,good article!!I like the post!117

  144. Avatar
    Injection mold over 3 years later:

    Intertech Machinery Inc. provides the most precise Plastic Injection Mold and Rubber Molds from Taiwan. With applying excellent unscrewing device in molds,

    Intertech is also very professional for making flip top Cap Molds in the world. Mold making is the core business of Intertech (Taiwan). With world level technology, Intertech enjoys a very good reputation for making Injection Mold and Plastic Molds for their worldwide customers.

  145. Avatar
    decks brisbane over 3 years later:

    Thank you for another essential article. Where else could anyone get that kind of information in such a complete way of writing ? I have a presentation incoming week, and I am on the lookout for such information.

  146. Avatar
    pandora swarovski over 3 years later:

    With the popularity of the Kabbalah red string bracelet pandora swarovski there are really great ways to wear it. Most people swarovski crystals bracelets just think that the accessory itself is nothing but bridesmaids jewelry set just a string. Well, excuse me but I beg to differ most swarovski people would use to for its real use to protect them swarovski pen from the malicious evil eye. So, when wearing a Kabbalah red string bracelet what are the things that we can keep in mind?

  147. Avatar
    cheap mlb hats over 3 years later:

    Then the bureau was motivated to deliver a movie offering the actual shoe to the NFL’s Extremely Jar. No trouble. Market internet connections baseball caps likewise brought about the NFL’s Buccaneers to get Mutt within February because Bucs’ marketing organization with file, considering the job to create the actual crew’s image in the neighborhood.

  148. Avatar
    Mold Making over 3 years later:

    With more than 20 years of experience, Intertech provides an extensive integrated operational ability from design to production of molds 100% made in Taiwan. Additional to our own mold making factory, we also cooperate with our team vendors to form a very strong working force in Taiwan.

    For the overseas market, we work very closely with local representatives in order to take care of the technical communication and after-sales service to our customers. We also participate in the EUROMOLD & FAKUMA exhibitions and meet our customers every year in Europe. By concentrating on mold “niche markets”, we play a very useful mold maker role from the Far East whenever customers want to develop their new projects. We provide services from A to Z to our customers on a very economic cost and effect basis.

Comments