SimpleDB::Class::Role::Itemized - Provides utility methods to classes that need to instantiate items.


SimpleDB-Class documentation Contained in the SimpleDB-Class distribution.

Index


Code Index:

NAME

Top

SimpleDB::Class::Role::Itemized - Provides utility methods to classes that need to instantiate items.

VERSION

Top

version 1.0502

SYNOPSIS

Top

 my $class = $self->determine_item_class(\%attributes);

 my $item = $self->instantiate_item(\%attributes, $id);

 my $item = $self->parse_item($id, \@attributes);

DESCRIPTION

Top

This is a Moose::Role that provides utility methods for instantiating SimpleDB::Class::Items.

METHODS

Top

The following methods are available from this role.

instantiate_item ( attributes, [ id ] )

Instantiates an item based upon it's proper classname and then calls update to populate it's attributes with data.

attributes

A hash reference of attribute data.

id

An optional id to instantiate the item with.

determine_item_class ( attributes )

Given an attribute list we can determine if an item needs to be recast as a different class.

attributes

A hash ref of attributes.

parse_item ( id , attributes )

Converts the attributes section of an item document returned from SimpleDB into a SimpleDB::Class::Item object.

id

The ItemName of the item to create.

attributes

An array of attributes as returned by SimpleDB::Client.

LEGAL

Top


SimpleDB-Class documentation Contained in the SimpleDB-Class distribution.
package SimpleDB::Class::Role::Itemized;
BEGIN {
  $SimpleDB::Class::Role::Itemized::VERSION = '1.0502';
}

use Moose::Role;
use SimpleDB::Class::Types ':all';

requires 'item_class';

#--------------------------------------------------------

sub instantiate_item {
    my ($self, $attributes, $id) = @_;
    $attributes->{simpledb} = $self->simpledb;
    if (defined $id && $id ne '') {
        $attributes->{id} = $id;
    }
    return $self->determine_item_class($attributes)->new($attributes);
}

#--------------------------------------------------------

sub determine_item_class {
    my ($self, $attributes) = @_;
    my $class = $self->item_class;
    my $castor = $class->_castor_attribute;
    if ($castor) {
        my $reclass = $attributes->{$castor};
        if (ref $reclass eq 'ARRAY') {
            $reclass = $reclass->[0];
        }
        if ($reclass) {
            return $reclass;
        }
    }
    return $class;
}

#--------------------------------------------------------

sub parse_item {
    my ($self, $id, $list) = @_;
    unless (ref $list eq 'ARRAY') {
        $list = [$list];
    }

    # format the data into a reasonable structure
    my $attributes = {};
    foreach my $attribute (@{$list}) {

        # get attribute name
        unless (exists $attribute->{Name}) {
            return undef; # empty result set
        }
        my $name = $attribute->{Name};

        # skip handling the 'id' field
        next if $name eq 'id';

        # get value
        my $value = $attribute->{Value};
        if (ref $value eq 'HASH' && !(keys %{$value})) { # undef comes back as an empty hash for some reason
            next; # no need to store undef
        }

        # store attribute list
        push @{$attributes->{$name}}, $value;
    }

    # now we can determine the item's class from attributes if necessary
    my $item_class = $self->determine_item_class($attributes);

    # now we're ready to instantiate
    $attributes->{simpledb} = $self->simpledb;
    $attributes->{id} = $id;
    return $item_class->new($attributes);
}


1;