package Tree; sub add_item { my ($self, $item) = @_; my $parent_node = ...; $parent_node->add(new Node($item)); } #### package Tree; sub add_item { my ($self, $item) = @_; my $node_factory = $self->{node_factory}; my $parent_node = ...; $parent_node->add($node_factory->create($item)); } sub set_node_factory { my ($self, $node_factory) = @_; $self->{node_factory} = $node_factory; } package NodeFactory; # Overridable sub create { shift(@_); return Node->new(@_); }