/stop command
[scpubgit/Clifton.git] / lib / App / Clifton / Set.pm
CommitLineData
73ebcfa8 1package App::Clifton::Set;
2
3use Scalar::Util qw(blessed);
4use Moo::Role;
5
6requires '_set_of_class';
7requires '_set_over';
8
9has _set => (is => 'ro', default => sub { {} });
10
11sub add {
12 my ($self, $spec) = @_;
13 $self->_set->{$self->_spec_to_key($spec)} = $self->_spec_to_object($spec);
14}
15
16sub get {
17 my ($self, $spec) = @_;
18 $self->_set->{$self->_spec_to_key($spec)};
19}
20
3b539344 21sub remove {
22 my ($self, $spec) = @_;
23 delete $self->_set->{$self->_spec_to_key($spec)};
24}
25
38180dc8 26sub flatten {
27 my ($self) = @_;
28 my $set = $self->_set;
29 map $set->{$_}, sort keys %$set;
30}
31
73ebcfa8 32sub _spec_to_object {
33 my ($self, $spec) = @_;
34 if (blessed($spec) && $spec->isa($self->_set_of_class)) {
35 $spec;
36 } else {
37 $self->_new_member($self->_spec_to_constructor_args($spec));
38 }
39}
40
41sub _new_member {
42 my ($self, $args) = @_;
43 $self->_set_of_class->new($args);
44}
45
46sub _spec_to_constructor_args {
47 my ($self, $spec) = @_;
48 $spec;
49}
50
51sub _spec_to_key {
52 my ($self, $spec) = @_;
53 my $key = $self->_set_over;
54 die "key ${key} is required" unless $spec->{$key};
55 $spec->{$key};
56}
57
581;