Value objects

Introduction

Eric Evans writes in his DDD book:

When you care only about the attributes of an element of the model, classify it as a value object. Make it express the meaning of the attributes it conveys and give it related functionality. Treat the value object as immutable. Don't give it any identity and avoid the design complexities necessary to maintain entities.

Many objects have no conceptual identity. These objects describe some characteristic of a thing.

A value object is an object that describes some characteristics or attribute but carries no concept of identity .

Samples

There are many samples where the introduction of a value object is useful. One of the most used value objects in DDD is certainly the Money value object. There is even a pattern called after this value object (the money pattern).

money

A large proportion of the computers in this world manipulate money. But money isn't a first class data type on the .Net framework. The lack of a type causes problems, the most obvious surrounding currencies. If all your calculations are done in a single currency, this isn't a huge problem, but once you involve multiple currencies you want to avoid adding an amount expressed in dollars to an amount expressed in Euro without taking the currency differences into account. Also rounding is a problem. Monetary calculations are often rounded to the smallest currency unit (pennies for dollar and cent for Euro).

Another typical example of a value object is an Address. The address is even a very interesting beast, since it contains a reference to Country which in turn often is treated like an entity.

 address

Yet another example is a geographical coordinate. It consists of the two values longitude and latitude.

 GeoCoordinate

Often we see people introduce a value object for the names of a person. Such a name value object could e.g. consist of the three members first name, middle name and last name where the first and the last are mandatory and the middle name is optional.

 name

Finally another well known value object is Color. Color is a structure which normally consist of four values (red, green, blue and alpha)

color

Note that the alpha channel is an indicator for the transparency of a colored shape. It goes from completely transparent (0) to opaque (255).

Immutability

As told earlier a value object should always be immutable. The consequence of this is that once its properties are set they cannot be changed. The best way to guarantee this is that all properties are read-only (they have private or no setter methods). A new instance of a value object is completely defined through its constructor. Let's take as a sample the Name value object.

public class Name
{
    public string FirstName { get; private set; }
    public string MiddleName { get; private set; }
    public string LastName { get; private set; }
 
    public Name(string firstName, string middleName, string lastName)
    {
        FirstName = firstName;
        MiddleName = middleName;
        LastName = lastName;
    }
}

Validation

Since a value object is immutable it makes sense that each value object must always be in a valid state. The validation happens in the constructor of the value object. Again let's look at the Name value object as an example. Below I present the constructor of the value object. This time with the validation logic.

public Name(string firstName, string middleName, string lastName)
{
    // Validation logic
    if(string.IsNullOrEmpty(firstName)) 
        throw new ArgumentException("First name cannot be undefined.");
    if(string.IsNullOrEmpty(lastName)) 
        throw new ArgumentException("Last name cannot be undefined.");
 
    if(firstName.Length>50)
        throw new ArgumentException("Length of first name cannot exceed 50 characters.");
    if(middleName.Length>30)
        throw new ArgumentException("Length of middle name cannot exceed 30 characters.");
    if(lastName.Length>50)
        throw new ArgumentException("Length of last name cannot exceed 50 characters.");
 
    FirstName = firstName;
    MiddleName = middleName;
    LastName = lastName;
}

The validation logic checks that the first and last name are given and that any of the names does not exceed the maximal tolerated length. If the validation tests have all passed then we are sure that our value object is now in a valid state. From now on we will never again have to make validation check against our Name instance. You should not underestimate the positive consequences of this!

Equality

It is very important that two instances of a value object are comparable, that is whether they contain the same values in their constituent properties. To achieve this we have to at least override the two sister methods Equals and GetHashCode which are inherited from the base class System.Object.

But we should also implement the generic interface IEquatable<T> in our value object to provide a type safe method for comparing two instances.

public class Name : IEquatable<Name>
{
    // omitted code for brevity...
 
    public override int GetHashCode()
    {
        return string.Format("{0}|{1}|{2}", FirstName, MiddleName, LastName).GetHashCode();
    }
 
    public override bool Equals(object obj)
    {
        return Equals(obj as Name);
    }
 
    public bool Equals(Name other)
    {
        if(other==null) return false;
        return FirstName.Equals(other.FirstName) &&
               ((MiddleName == null && other.MiddleName == null) ||
                (MiddleName != null && MiddleName.Equals(other.MiddleName))) &&
                LastName.Equals(other.LastName);
    }
}

Note that my implementation of GetHashCode is certainly not the unique or best implementation. But it is easy and works for me.

In the Equals method I compare the two instances of the value object property by property. Since the middle name is optional it can be null and thus needs a special treatment.

For convenience we can also override the operators == and != as follows

public static bool operator ==(Name left, Name right)
{
    return Equals(left, right);
}
 
public static bool operator !=(Name left, Name right)
{
    return !Equals(left, right);
}

this allows me to use such constructs as

if(name1 == name2) {...}    or

if(name1 != name2) {...}.

Builders

Creating an instance of a value object can be error prone when using the constructor. The code is not very readable. How should I know whether the following code fragment is correct?

address = new Address("Paradise Street 12", "P.O.Box 233", "Neverland", "82344", unitedStates);

Could it possibly be that the postal code and the city are confused? How should I know. Just by reading I have no idea since the code is not self describing. So, is this the correct version?

address = new Address("Paradise Street 12", "P.O.Box 233", "82344", "Neverland", unitedStates);

Note that both versions compile, but only the first one is correct. To eliminate this weakness people often implement object builders for complex value objects like an address. Often a builder implements some kind of fluent interface to make the code very self explaining and compact (free of syntactic noise!).

address = new AddressBuilder()
    .AddressLine1("Paradise Steet 12")
    .AddressLine2("P.O.Box 233")
    .PostalCode("82344")
    .City("Neverland")
    .Country(unitedStates);

The above code snippet is very self expressing, isn't it?

How is such a builder implemented? Let's have a look at a possible solution

public class AddressBuilder
{
    internal string addressLine1;
    internal string addressLine2;
    internal string city;
    internal string postalCode;
    internal Country country;
 
    [DebuggerStepThrough]
    public AddressBuilder AddressLine1(string line)
    {
        addressLine1 = line;
        return this;
    }
 
    [DebuggerStepThrough]
    public AddressBuilder AddressLine2(string line)
    {
        addressLine2 = line;
        return this;
    }
 
    [DebuggerStepThrough]
    public AddressBuilder PostalCode(string code)
    {
        postalCode = code;
        return this;
    }
 
    [DebuggerStepThrough]
    public AddressBuilder City(string city)
    {
        this.city = city;
        return this;
    }
 
    [DebuggerStepThrough]
    public AddressBuilder Country(Country country)
    {
        this.country = country;
        return this;
    }
 
    public static implicit operator Address(AddressBuilder builder)
    {
        return new Address(builder.addressLine1, builder.addressLine2, builder.city, builder.postalCode, builder.country);
    }
}

Especially have a look at the implementation of the implicit operator!

Note that the DebuggerStepThrough attribute is used to avoid debugging through the builder code since the code can be assumed to be error free (it is trivial).

Object Mother

When following TDD (that is: write the test first and only then implement the code to satisfy the test...) we often need some sample data. In the case of a value object we can directly create such an instance in the test method. But this is not DRY since we will have a lot of code duplication. One possible solution is the introduction of a so called object mother. This is a class with static methods which delivers us prefabricated (valid) value objects.

An Object Mother is another name for a factory for test objects. It can be implemented as static class with appropriate methods, e.g.

public static class ObjectMother
{
    private static readonly Country unitedStates = new Country("USA", "United States of America");
    private static readonly Country switzerland = new Country("CH", "Switzerland");
 
    public static Address GetAddress()
    {
        return new AddressBuilder()
            .AddressLine1("Paradise Street 12")
            .AddressLine2("P.O.Box 233")
            .PostalCode("82344")
            .City("Neverland")
            .Country(unitedStates);
    }
 
    public static Address GetSwissAddress()
    {
        return new AddressBuilder()
            .AddressLine1("In der Matte 8")
            .PostalCode("3000")
            .City("Bern")
            .Country(switzerland);
    }
}

In the above sample I use the address builder introduced above to create sample value objects of type address.

Depending on the needs we can have one or several method for any object type we need (or even several overloads of a method if we want to have some configurability of the created objects...).

Enum type value objects

A special variant of a value object is a value object whose base is a enum type. Let me give some samples:

Let's assume we have a task entity. A task object has a state which can have any of the following values

public enum TaskStatusEnum
{
    Undefined = 0,
    Pending,
    InProgress,
    Done
}

But the direct usage of an enum type is unhandy in a domain model. Thus I never use an enum type directly as a value object but rather encapsulate it in a class. A possible implementation for this would be

public class TaskStatus
{
    public TaskStatusEnum Status { get; private set; }
    public string Description { get { return Status.ToString(); } }
 
    public TaskStatus(TaskStatusEnum status)
    {
        Status = status;
    }
}

Instances of the TaskStatus class are value objects. Only the property Status is mapped to the database. The Name property is only for visual representation of a task status (on a view). Of course I would have to implement the IEquality<T> interface in the above class as well as override the Equals and GetHashCode methods. But I have omitted this for brevity.

For convenience I normally implement also a static property get for any of the possible values of the enum in the above class, that is

public static TaskStatus Undefined { get { return new TaskStatus(TaskStatusEnum.Undefined); } }
public static TaskStatus Pending { get { return new TaskStatus(TaskStatusEnum.Pending); } }
public static TaskStatus InProgress { get { return new TaskStatus(TaskStatusEnum.InProgress); } }
public static TaskStatus Done { get { return new TaskStatus(TaskStatusEnum.Done); } }

As you can see it's a little bit more overhead over using an enum directly but it's definitely worth the effort. You gain all the advantages a value object offers you.

Value objects and NHibernate

When we deal with NHibernate a value object is represented by a -->Component. A value object is not stored in a separate table but rather embedded in the table related to the containing entity. That is, if I have an Account entity which contains a property Balance which in turn is a value object (of type Money) then I only have a table Account in the database (but no Money table) and the fields of the Balance value object are part of the Account table.

Mapping

How are value objects mapped in NHibernate? I want to describe three possible ways how we can achieve the desired result. Let's take a (simplified) entity Account as an example

public class Account
{
    public Guid Id { get; set; }
    public string AccountNo { get; set; }
    public Money Balance { get; set; }
 
    // additional properties and logic
    // omitted for brevity...
}

XML mapping files

The most common way to describe the mapping between a domain model and the underlying database is by using XML mapping files.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Account">
    <id name="Id">
      <generator class="guidcomb"/>
    </id>
    <property name="AccountNo" not-null="true" length="20"/>
    
    <component name="Balance">
      <property name="Value"/>
      <property name="CurrencyCode"/>
    </component>
    
  </class>
</hibernate-mapping>

Note that the Money value object is mapped via the <component> tag in the mapping file.

Castle Active Record

If you are using Castle Active Record for your mapping then you just have to decorate the Balance property of the Account with the attribute [Nested].

[ActiveRecord]
public class Account
{
    [PrimaryKey]
    public Guid Id { get; set; }
    [Property]
    public string AccountNo { get; set; }
    [Nested("Balance")]
    public Money Balance { get; set; }
 
    // additional properties and logic
    // omitted for brevity...
}

You can provide as a parameter to the attribute the column prefix that will be used when mapped to the underlying database table. In the above example the fields in the Account table would be BalanceValue and BalanceCurrencyCode.

Fluent Interface

With the new Fluent NHibernate framework which I descibed here one can define the mapping as follows

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Id(x => x.Id);
 
        Map(x => x.AccountNo)
            .CanNotBeNull()
            .WithLengthOf(20);
 
        Component<Money>(
            x => x.Balance, m =>
                                {
                                    m.Map(x => x.Value, "BalanceValue");
                                    m.Map(x => x.CurrencyCode, "BalanceCurrencyCode");
                                });
    }
}

Note that the benefit of the fluent interface is not the brevity of the code but rather the robustness, testability of the mapping as well as the ability to include the mapping in any refactoring.

Summary

I have introduced you to the value object, which is a fundamental piece of DDD. Not only have I presented you the theory behind a value object but also shown you some possible implementation for immutability, validation and mapping of value objects. I also have shown how one can handle value objects which are based on a .Net enum. Further I introduced the concept of builders (for value objects) which help you make the code more readable (and thus maintainable). Last but not least I discussed the usage of the Object Mother pattern in the context of test driven development (TDD).

Enjoy

Blog Signature Gabriel

Print | posted on Tuesday, September 16, 2008 11:31 PM

Comments on this post

# re: Value objects

Requesting Gravatar...
Great article (as always).

Just a note about immutable... IMHO - from a coding perspective sometimes using a struct instead of a class is quite handy working with value objects. Eg if the Name type in your example is a struct, you don't need to create a new instance to make it immutable.
Left by Roger on Sep 16, 2008 11:58 PM

# re: Value objects

Requesting Gravatar...
Thanks for your excellent article !!

why you don't use struct instead of class for values object ? Is it inappropriate ?

Cordially,

Florian
Left by Florian on Sep 22, 2008 3:20 AM

# re: Value objects

Requesting Gravatar...
structs have various disadvantages compared to classes. Size is one of them. IIRC Microsoft suggest a size not far above 16 bytes...

structs can not be subclassed...
Left by nhibernate on Oct 02, 2008 5:44 AM

# re: Value objects

Requesting Gravatar...
One thing I don't understand if the Value object is immutable, how binding would work if you bind your domain object to a form
Left by adriaan on Oct 08, 2008 7:51 AM

# re: Value objects

Requesting Gravatar...
@adriaan: It would be read-only binding (which is possible in e.g. WinForms).
But normally I don't use domain objects directly in the presentation layer but rather a view model (data transfer objects - DTO). In web scenarios I use the MVC pattern and in WinForms the MVP pattern...
Left by nhibernate on Oct 08, 2008 10:00 AM

# re: Value objects

Requesting Gravatar...
Great post, I especially like the use of the object builders, much more readable. They also sit nicely with the object mother.
In your comment above you mentioned using the "view model" as opposed to the domain object. I think I know where you are coming from but do you have any examples of this?
Thanks, PK :-)
Left by Paul Kohler on Oct 08, 2008 10:20 PM

# re: Value objects

Requesting Gravatar...
@paul: maybe in a future post... ;-) Note that this has to do with the fact that I like to have entities in my domain model which are always in a valid state. Thus I cannot simply bind an (complex) entity to a view. But there are other reasons of course. I'll try to put a post together about entities, data transfer objects and mappers.
Left by nhibernate on Oct 09, 2008 12:11 AM

# re: Value objects

Requesting Gravatar...
nice article, but why it's better to encapsulate an enum in a object?

little tips: to override GetHshCode is better to use
FirstName.GetHashCode() ^
MiddleName.GetHashCode() ^
LastName.GetHashCode();

it's faster and, from a statystical point of view, has a better distribution in the int32 range.
Left by mark on Oct 29, 2008 4:38 AM

# re: Value objects

Requesting Gravatar...
Nice programming article, I really enjoy reading this one, I hope there will more details in next one as I am looking for more ideas of programming.
Left by Logo Design Calgary on Dec 06, 2009 7:51 AM

# re: Value objects

Requesting Gravatar...
Providing a fluent interface for NHibernate is a great move, especially in the mapping space. It should really help with the adoption of NHibernate in general .I know that the XML mappings for properties really put me off in the early days, trying to work it out from samples and the java documentation etc.
Left by Poker celebrities online on Dec 11, 2009 6:20 PM

# re: Value objects

Requesting Gravatar...
Working on Value Object is really a difficult task but your this tutorial made it easy for me to handle it without any problem. If anyone seeking information about then this blog is the best place for him as it has quality content for your required information. Thanks for sharing.
Left by Burberry Sunglasses on Dec 14, 2009 1:59 PM

# re: Value objects

Requesting Gravatar...
I must say, great tips!
Left by Professional essay writers on Dec 30, 2009 7:59 AM

# re: Value objects

Left by build your own solar panel on Jan 29, 2010 4:30 PM

# re: Value objects

Requesting Gravatar...
I must say that this is a great post. I loved reading it. You have done a great job.
Left by Offset Printing on Feb 07, 2010 11:01 PM

# re: Value objects

Requesting Gravatar...
Thanks for sharing. i really appreciate it that you shared with us such a informative post..
Online Advertising degree | Online Finance degree | Online Marketing degree | Online Project Management degree | Computer Science school
Left by siomy on Feb 09, 2010 9:57 PM

# re: Value objects

Requesting Gravatar...
I happy to find many good point here in the post, writing is simply great, thank you for the post.
Left by Spa NYC on Feb 10, 2010 11:23 PM

# re: Value objects

Requesting Gravatar...
After reading your post.., I remember a song entitled "The way we were"
Left by Virginia blog on Feb 11, 2010 3:41 PM

# re: Value objects

Requesting Gravatar...
another quality post
Left by watches uk on Feb 18, 2010 2:03 AM

# 9Dragons gold

Requesting Gravatar...
Do you know9Dragons gold?if you play the online game,you will know9 Dragons goldis the game gold.In the game,if you had morebuy 9 Dragons gold ,you will had a tall level.But if you wantcheap 9Dragons gold,you can come here and spend a little money to bought9Dragons money.Quickly come here.
Left by 9Dragons gold on Feb 24, 2010 1:17 PM

# discount Ugg Broome Boots in chestnut leather online sales

Requesting Gravatar...
YS0225A8 Befor there was no reason in the world,As now there is!The moncler jackets course of water was my only course,My repetitions oceans' sough and swell ugg adirondack boots!My seasons pleasurable,Before there was no reason in the world,As now there is ugg broome boots!To measure time from sleep I rose to sleep,To measure space I pastured on surprise http://www.edhardy-buy.com/,O meadows of resemblances,I was the grove on whose mosaic floors,The moncler online seeds of otherwise were spent,My gods had many arms,I was the Caesar of unmarshaled grass ugg boots!Faustus in the branches,My first ambitions were my sorrows long!Before there was no reason in the world,As now there is!
Left by discount womens moncler jacket on Feb 24, 2010 10:45 PM

# discount air jordan shoes 23 sales online

Requesting Gravatar...
YS0225A7 when the sun hugs th moon, the sky clses her eyes.when the sun hug the moon the sea quiet her jordans shoes.when the sun hugs the moon,the forest stops her susurrus.when the sun hugs the nike sb dunk high,the desert hodlds her breathe.Thousands of years's waiting is only for this nike acg shoes moment.Never be disappointed.Never give up.It hax been sucha long time.At nike air max 2003 this momentmeet each other in course of time.Do not cry,Moon.I guard you forever.Cause you are in my life,everyting has its meaning.The fascinating Diamond Ring,is the ring i give you,May it give you warm http://www.nikejordanshoes2sell.com/ threduce your tears.Do not cry,Sun,I will be there with you forever/Meeting you has given me precious memeory.The resplendent Baily Beads.is the gem i give you .May i give you cheap air jordan 22 shoes strength, shine in your morning.Meet soon and part soon.It makes peop;e retrospect in spite of lasting a few minutes.A long times waiting is coming.Don't know when the next meeting is .When the sun hugs the Moon. the Moon hugs the sun as well Hugging tightly,regian the lost nicety.
Left by discount nike air max shoes sale on Feb 24, 2010 10:47 PM

# discount air jordan shoes 25 sales online

Requesting Gravatar...
YS0225A6 When you belive,Though hope is frail.It's hard to kill,Who knows what cheap prada shoes miracles,You can achieve,When you belive! Somehow you will,

You will when you belive new nike air max!And in this time o, When prayer so often proves in vain, Hope seems like the http://www.nikeaf1jordanshoes.com/summer birds. Too swiftly flown away, And now I am standing wholesale gucci shoes here.My heart's so full I can't explain.Seeking faith and speaking women's nike shox words I never thought I'd say, They don't always happen when you ask authentic air jordan shoes.And it's easy to give in to your fear. But when you're blinded by your pain!
Left by discount mens moncler down coat on Feb 24, 2010 10:50 PM

# discount ed hardy women long sleeve shirts sales online

Requesting Gravatar...
YS0225A5 If you think you are beaten, you are! If you think you dare noted hardy clothing, you don't! If you want to win but think you can't, It's almost a cinch you won't ed hardy hoodies! If you think you'll lose,you're lost! For out of the world we find.Success begins wih a fellow's will,It's all in a ed hardy shirts state of mind! Life's battles don't always go.To the stronger and faster ed hardy coats man,But sooner or later the man who wins,Is the man who thinks he can! When You Belive http://www.edfashionclothes.com/,Many night we've prayed!With no proof anyone could hear!In our heart a hopeful moncler online store song,we barely understood!Now we are not afraid !Although we know there's much to fear!We were moving the moncler jackets mountian long,Before we knew we could!There can be miracles!
Left by discount mens moncler down coat on Feb 24, 2010 10:53 PM

# discount christian louboutin sandals online sales

Requesting Gravatar...
YS0226A1 That your heart has been broken,Hear the words,I'm here, my child,;And know yur christian louboutin uk angel has spoken.For even in the darkest hour,When all of discount louboutin shoes hope seems gone,They'll give you strength to live your life,And desire to go on.And if your faith in Heaven, Should ever fade away,They'll help renew your christian louboutin boots spirit, And help you find your way.Even though you're ever filled with doubt, About the christian louboutin pumps life you live,Know that they are there to give you All that they can give.For you see, the Father sent them,Because to Him, you mean so much,That He sent them just for you,my louboutin sale friend,And your life, they will touch.They will always be here,They will never leave your http://www.christianlouboutinshoestore.com/ side;And upon their strength and guidance,You always may rely.Take comfort in their guidance, Draw strength from up above,And know that their sweet presence,Is God's precious gift of love.
Left by cheap christian louboutin shoes on Feb 25, 2010 2:59 PM

# discount women's ugg elsey boots 5596 sales online

Requesting Gravatar...
YS0226A2 If I were boy again, I would practice perseverance more often, and never give up a thing because it was ugg australia boots or inconvenient. If we want light, we must conquer darkness. Perseverance can sometimes equal genius cheap ugg boots in its results. “There are only two creatures,” syas a proverb, “who can surmount the pyramids—the eagle and the snail.” If I were a uggs sale boy again, I would school myself into a habit of http://www.topsnowboots.com/ attention; I would let nothing come between me and the subject in hand. I would remember that a good skater never tries to skate in two ugg cardy boots directions at once. The habit of attention becomes part of our life, if we begain early enough. I often hear cheap gucci shoes grown up people say “ I could not fix my attention on the sermon or ugg coquette book, although I wished to do so” , and the reason is, the habit was not formed in youth.
Left by cheap ugg upside boots 5163 on Feb 25, 2010 3:02 PM

# discount Women's ugg adirondack boots II sales online

Requesting Gravatar...
YS0226A3 Hold fa to dreams.For if dreams die. Life is a broken-winged bird,That ugg australia boots can never fly.Hold fast to dreams. For when dreams go,Life is a barren ugg tall boots field, Frozen only with snow !You never know until you try; And you never try unless you really try ugg cardy boot. You give it your best shot; You do the best you can. And if you have done everything http://www.uggsnowbootsbest.com/! In your power,and still,The truth of the uggs argyle knit matter is! That you haven\'t failed at all.When you reach for your dreams,No matter what ugg boots they may be,You grow from the reaching;You learn from the trying;You win from the doing.
Left by cheap ugg classic cardy boots on Feb 25, 2010 3:05 PM

# discount reebok nfl jerseys online sales

Requesting Gravatar...
YS0226A4 A true riend is someone who reaches for your hand and touches your cheap hockey jerseys heart.There's always going to be people that hurt you,so what you have to do is keep on trusting nfl jerseys and just be more careful about who sport jerseys you trust next time around.Make youself a better person and know who you are discount nba jerseys before you try and know someone else and expect them to know you mlb jerseys on sale.Remember:Whatever happens,happens for a reason.How many people actually have 8 true http://www.nfljerseymlb.com/friends Hardly anyone I know.But some of us have all right friends and good friends.
Left by cheap adiads nba jerseys sale on Feb 25, 2010 3:09 PM

# discount ugg sienna miller boots 5818 sales online

Requesting Gravatar...
YS0226A9 Unwearie still, lover by lover,They paddle in the cold,Companionable ugg australia shoes streams or climb the air;Their hearts have not grown old;ugg coquette Passion or conquest, wander where they will, Attend upon them still ugg adirondack boots. But now they drift on the still water, Mysterious, beautiful; Among what http://www.uggboots4buy.com/ rushes will they build, By what lake’s edge or pool,Delight men’s mbt shoes eyes when I awake some day.To find they have flown uggs classic cardy away?Before there was no reason in the world As now there is I was the bough bent easy by a ugg boots bird I was the vague blue-grazing flock The sleeping and invisible!
Left by cheap women's ugg elsey boots on Feb 25, 2010 3:12 PM

# discount mens air jordan shoes 13 online sales

Requesting Gravatar...
YS0226A10 When you a old and gray and full of sleep,And nodding by the moncler jackets fire, take down this book! And slowly read jordans sheoes , and dream of the soft look,Your eyes had once, and of their cheap nike shoes shadows deep;How many loved your moments of glad grace,And loved your beauty with nike air force 1 love false or true; But one man loved the pilgrim soul in you,And http://www.onestop-onlineshopping.com/ loved the sorrows of your changing face; And bending down beside the designer clothing glowing bars,Murmur, a little sadly, how love fled.And paced upon the mountains overhead discount air jordan shoes,And hid his face amid a crowd of stars.
Left by cheap nike air max 90 online on Feb 25, 2010 3:23 PM

# discount louis vuitton damier canvas handbags online sales

Requesting Gravatar...
YS0226A11 Srounding you are angels,They are there to guide your path.If designer purses weaesskn overcomes you,They'll give you strength if you will ask. They are your protection.When discount designer bags on sale life seems too hard to bear,And though you feel alone at times, The louis vuitton 2009 angels ... they are there.Their faces may be hidden And their voices you might not hear,But they are ALWAYS with you,Through your laughter or your tears.http://www.handbags4buy.com/ They'll walk along beside you,They'll guide your leather handbags steps along the way, They'll comfort you and hold you,Protect you dior handbags night and day.They'll hold to your hand tightly ,They'll not ever let it go,And they'll gently lead you cheap designer handbagsforward,Taking each step very slow.For even as you slumber,They watch closely over you;They are there beside you. In each and every thing you do.
Left by cheap nike air max 90 online on Feb 25, 2010 3:26 PM

# re: Value objects

Requesting Gravatar...
I am always searching online for articles that can help me. Thank you
Powerpoint Converter
..
Left by powerpoint on Mar 05, 2010 9:19 PM

# re: Value objects

Requesting Gravatar...
I know that the XML mappings for properties really put me off in the early days, trying to work it out from samples and the java documentation etc.
Left by ucvhost on Mar 06, 2010 2:26 AM

# ugg boots

Requesting Gravatar...


they are very good and useful!!!
ugg outlet
cheap uggs
nike shoes
wholesale watches lid
Left by ugg boots on Mar 07, 2010 5:31 PM

# re: Value objects

Requesting Gravatar...
It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info! Youtube to MP4 Converter
Convert PDF to image
s
Left by powerpoint on Mar 08, 2010 2:09 PM

# re: Value objects

Requesting Gravatar...
It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info! Youtube to MP4 Converter
Convert PDF to image .
24
Left by powerpoint on Mar 08, 2010 2:39 PM

# Regardless of the trend of the times and social fashion <A href="http://www.olugg.com/handbags-balenciaga-handbags-c-490_491.htm

Requesting Gravatar...
Regardless of the trend of the times and social fashion balenciaga handbags, people always can with noble quality, beyond time and society, walk oneself the ugg classic tall bootscorrect road. now, everybody to refrigerators, automobiles and houses and rush, chase, competition. this mulberry handbags is the characteristic of our age. but also have many people, they ghd hair straightener don't pursue these material things, they pursue and truth, the hermes handbags inner freedom and peace.
Left by handbags balenciaga sale on Mar 09, 2010 2:11 AM

# re: Value objects

Requesting Gravatar...
Whenever I hear friends talking about mbt, my feeling would always be a painful mixture of envy and

helplessness. As a matter of fact, I have long been craving about possessing a pair of MBT shoes. To a girl of low stature as me, a pair of mbt shoes could make me seem more slender or least won't be dwarfed by other girls. But its high price always

makes me feel hard to afford due to my restrained financial conditions.
But not long ago, a friend of mine sent me a pair of mbt shoes sale which thrilled me up for several days.

It's not until then that did I realize each penny for it is well paid. Indeed, it really deserves such a high price. I'm only regretting that I didn't

buy one earlier.
Left by mbt shoes on Mar 09, 2010 3:38 PM

# re: Value objects

Requesting Gravatar...
Whenever I hear friends talking about mbt, my feeling would always be a painful mixture of envy and

helplessness. As a matter of fact, I have long been craving about possessing a pair of MBT shoes. To a girl of low stature as me, a pair of mbt shoes could make me seem more slender or least won't be dwarfed by other girls. But its high price always

makes me feel hard to afford due to my restrained financial conditions.
But not long ago, a friend of mine sent me a pair of mbt shoes sale which thrilled me up for several days.

It's not until then that did I realize each penny for it is well paid. Indeed, it really deserves such a high price. I'm only regretting that I didn't

buy one earlier.




Whenever I hear friends talking about MBT shoes, my feeling would always be a painful mixture of envy and helplessness. As a matter of fact, I have

long been craving about possessing a pair of MBT shoes. To a girl of low stature as me, a pair of MBT shoes could make me seem more slender or least

won't be dwarfed by other girls. But its high price always makes me feel hard to afford due to my restrained financial conditions.
But not long ago, a friend of mine sent me a pair of MBT shoes which thrilled me up for several days. It's not until then that did I realize each

penny for it is well paid. Indeed, it really deserves such a high price. I'm only regretting that I didn't buy one earlier.
Left by ghd pink on Mar 09, 2010 3:39 PM

# re: Value objects

Requesting Gravatar...
It’s hard to find knowledgeable people on this topic, but you sound like you know what you’re talking about! Thanks Don’t stop writing, you’ve given me lots of good info!
Left by hotels milan italy on Mar 09, 2010 10:14 PM

# re: Value objects

Requesting Gravatar...
Thanks for sharing useful information
Best Windows VPS Hosting by ucvhost If you choosing for the best windows vps | cheap vps | windows hosting | Cheap Hosting | Forex Vps hosting service, you need to hunt for those virtual private servers that can run as isolated processes while being part of a Web Server, and provide you complete privacy and root access as the VPS owner. You should also ask for CPU resources, guaranteed bandwidth, memory, and disk space, to make the most of your chosen Windows VPS hosting service. Thanks ucvhost
Left by ucvhost on Mar 10, 2010 2:03 AM

Your comment:

 (will show your gravatar)
 
Please add 7 and 8 and type the answer here: