# $Id: /local/CPAN/Mango/lib/Mango/Wishlist/Item.pm 1644 2008-06-02T01:46:53.055259Z claco  $
package Mango::Wishlist::Item;
use strict;
use warnings;

BEGIN {
    use base qw/Handel::Cart::Item/;
    use Handel::Constraints ();
    use DateTime            ();
}
__PACKAGE__->storage->setup(
    {
        autoupdate     => 0,
        currency_class => 'Mango::Currency',
        schema_class   => 'Mango::Schema',
        schema_source  => 'WishlistItems',
        constraints    => {
            quantity => {
                'Check Quantity' => \&Handel::Constraints::constraint_quantity
            }
        },
        default_values => {
            quantity => 1,
            created  => sub { DateTime->now },
            updated  => sub { DateTime->now }
        }
    }
);
__PACKAGE__->result_iterator_class('Mango::Iterator');
__PACKAGE__->create_accessors;

sub price {
    return Mango::Currency->new( shift->result->get_column('price') || 0 );
}

sub update {
    my $self = shift;

    $self->updated( DateTime->now );

    return $self->SUPER::update(@_);
}

sub total {
    my $self = shift;

    return Mango::Currency->new(
        ( $self->result->get_column('price') || 0 ) * $self->quantity );
}

1;
__END__

=head1 NAME

Mango::Wishlist::Item - Module representing an individual wishlist item

=head1 SYNOPSIS

    my $items = $wishlist->items;
    
    while (my $item = $items->next) {
        print $item->sku;
    };

=head1 DESCRIPTION

Mango::Wishlist::Item represents an individual wishlist item.

=head1 METHODS

=head2 created

Returns the date and time in UTC the wishlist item was created as a DateTime
object.

    print $item->created;

=head2 description

=over

=item Arguments: $description

=back

Gets/sets the description for the current wishlist item.

    $item->description('Best Item Ever');
    print $item->description;

=head2 id

Returns the id of the current wishlist item.

    print $item->id;

=head2 sku

=over

=item Arguments: $sku

=back

Gets/sets the sku (stock keeping unit/part number) for the wishlist item.

    $item->sku('ABC123');
    print $item->sku;

=head2 price

=over

=item Arguments: $price

=back

Gets/sets the price for the current wishlist item. The price is returned as a
L<Mango::Currency|Mango::Currency> object.

    $item->price(12.95);
    print $item->price;
    print $item->price->format;

=head2 quantity

=over

=item Arguments: $quantity

=back

Gets/sets the quantity, or the number of this item being purchased.

    $item->quantity(3);
    print $item->quantity;

=head2 total

Returns the total price for the wishlist item as a
L<Mango::Currency|Mango::Currency> object. This is really just quantity*total
and is provided for convenience.

    print $item->total;
    print $item->total->format;

=head2 update

Saves any changes made to the wishlist item back to the provider.

    $item->quantity(2);
    $item->update;

Whenever L</update> is called, L</updated> is automatically set to the
current time in UTC.

=head2 updated

Returns the date and time in UTC the wishlist item was last updated as a
DateTime object.

    print $item->updated;

=head1 SEE ALSO

L<Mango::Wishlist>, L<Mango::Schema::Wishlist::Item>, L<Mango::Currency>

=head1 AUTHOR

    Christopher H. Laco
    CPAN ID: CLACO
    claco@chrislaco.com
    http://today.icantfocus.com/blog/
