[Moscow.pm] Mouse хочу странного

Ivan Petrov i.petro.77.00 на gmail.com
Ср Окт 16 15:25:18 PDT 2013


есть допустим объект


package User;
use Mouse;
has name => is => 'ro', isa => 'Str';

далее роль у него составляющая некие списки юзеров

with 'User::List';

...

package User::List;
use Mouse::Role;

sub list {
    ... возвратит список пользователей
}

sub list_by_some {
    ... возвратит еще какой-то список
}

ну понятно

далее у юзеров могут быть допустим  заказы. всю работу с заказами
выносим в отдельную роль (тут в примере работа со списками заказов)


package User::Order::List;
use Mouse::Role;

sub list_orders {
    ... возвратит список заказов пользователя
}

или игрушки

package User::Toy::List;
use Mouse::Role;

sub list_toys {
    ... возвратит игрушки пользователя
}

Ну вот, в большом проекте накапливается у некоторых сущностей много
разных ролей (или иерархия наследования, тут по разному можно
смотреть, это непринципиально).

и хочется писать далее не

$user->list_orders;
$user->list_toys;

а организовать нечто вроде неймспейсов ролевых.

то есть я хочу чтобы можно было написать

ns 'User::Order::List' => as => 'orders';
ns 'User::Toy::List' => as => 'toys';

в основном классе и далее чтобы можно было обращаться к его методам
так:

$user->orders->list;
$user->toys->list;

то есть очень похоже на контейнер, но это не контейнер.
это неймспейс.
функция $user->orders->list в качестве self должна получать объект $user.

то есть

has things => is => 'ro', isa => 'User::Thing::List';

тут не подходит. можно прослойку сделать на базе has конечно, но я
боюсь сильно просесть на бенчмарках.

что еще хочется:
- has внутри namespace
- в идеале наследования какого-то всей этой "хрени с которой
  взлетать", но в целом наследование мы почти не применяем в Mouse,
  поэтому не сильно актуально


я примерно представляю как такое написать, но 

1. может быть кто-то писал уже подобное? дайте ссылку
2. сейчас сильно занят другими проектами, но если бы кто взялся мог бы
профинансировать появление подобного модуля на cpan :) с
документацией, тестами и сравнительными бенчмарками
(сравниваем с Mouse::Role). Пусть бенчмаркает вдвое хуже метода
Mouse::Role, но не хуже чем вдвое. Я думаю можно сделать чтобы
бенчмаркало соизмеримо.

кто что думает?




Подробная информация о списке рассылки Moscow-pm