{"id":19533642,"url":"https://github.com/oliwierptak/popo","last_synced_at":"2025-06-23T13:36:18.953Z","repository":{"id":56686044,"uuid":"141752370","full_name":"oliwierptak/popo","owner":"oliwierptak","description":"POPO - plain old PHP object. Generate Data Structures / Data Transfer Objects from a schema.","archived":false,"fork":false,"pushed_at":"2023-08-03T15:18:37.000Z","size":825,"stargazers_count":19,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-05T10:54:58.321Z","etag":null,"topics":["builder","data-structures","data-transfer-object","generator","php","pojo","popo","popo-objects","schema-configuration","schema-files","schema-inheritance","yaml-configuration"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oliwierptak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-20T19:55:42.000Z","updated_at":"2024-12-13T02:48:52.000Z","dependencies_parsed_at":"2024-06-21T15:23:26.646Z","dependency_job_id":"bba2efe6-a1d4-4719-888f-2e167ef0a117","html_url":"https://github.com/oliwierptak/popo","commit_stats":{"total_commits":297,"total_committers":1,"mean_commits":297.0,"dds":0.0,"last_synced_commit":"3db90af599d5bae13acb48a32d46fad450b2b4c1"},"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/oliwierptak/popo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliwierptak%2Fpopo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliwierptak%2Fpopo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliwierptak%2Fpopo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliwierptak%2Fpopo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oliwierptak","download_url":"https://codeload.github.com/oliwierptak/popo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliwierptak%2Fpopo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261487468,"owners_count":23166088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["builder","data-structures","data-transfer-object","generator","php","pojo","popo","popo-objects","schema-configuration","schema-files","schema-inheritance","yaml-configuration"],"created_at":"2024-11-11T02:09:01.781Z","updated_at":"2025-06-23T13:36:13.930Z","avatar_url":"https://github.com/oliwierptak.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# POPO\n\n[![Build and run tests](https://github.com/oliwierptak/popo/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/oliwierptak/popo/actions/workflows/main.yml)\n\n**POPO** - \"Plain Old Php Object\" was inspired by \"Plain Old Java Object\" (POJO) concept.\n\nPOPO generator can also locate, load, validate, and combine schemas to create PHP source code files, representing\nArrays / Data Structures / Data Transfer Objects / Doctrine ORM Entities / MongoDB ODM Documents.\n\nPOPO Schema can be defined and extended on few levels, and it can be defined in multiple files.\n\n### Examples\n\n#### Single schema file\n\nSimple schema in YAML format, describing properties and relations of POPO objects.\n\n```yaml\n#example.popo.yml\n$:\n  config:\n    namespace: App\\Example\\Readme\n    outputPath: tests/\n\nExample:\n  Foo:\n    property: [\n      {name: title}\n      {name: bar, type: popo, default: Bar::class}\n    ]\n\n  Bar:\n    property: [\n      {name: title}\n    ]\n```\n\n#### Multiple schema files\n\nThe same example can be split into multiple files. However, this time, it's the `Bar` that modifies the `Foo` definition.\n\n```yaml\n#foo.popo.yml\nExample:\n  Foo:\n    property: [\n      {name: title}\n    ]\n```\n\n```yaml\n#bar.popo.yml\nExample:\n  Foo:\n    property: [\n      {name: bar, type: popo, default: Bar::class}\n    ]\n\n  Bar:\n    property: [\n      {name: title}\n    ]\n```\n\nThe generated code is the same, but the schema dependencies are inverted.\n\nIn both cases, `Foo` object uses `Bar` object as its dependency, and they are both defined under `Example` schema name.\n\n### Generated code usage examples\n\n#### Instantiate data structure from an array.\n\n```php\nuse App\\Example\\Readme\\Foo;\n\n$data = [\n    'title' =\u003e 'A title',\n    'bar' =\u003e [\n        'title' =\u003e 'Bar lorem ipsum',\n    ],\n];\n\n$foo = (new Foo)-\u003efromArray($data);\n\necho $foo-\u003egetTitle();\necho $foo-\u003erequireBar()-\u003egetTitle();\n```\n\nOutput:\n\n```\nA title\nBar lorem ipsum\n```\n\n#### Display hierarchy of objects as an array.\n\n```php\nuse App\\Example\\Readme\\Foo;\n\n$foo = (new Foo);\n$foo-\u003erequireBar()-\u003esetTitle('new value');\n\nprint_r($foo-\u003etoArray());\n```\n\nOutput:\n\n```\n[\n    'title' =\u003e null,\n    'bar' =\u003e [\n        'title' =\u003e 'new value',\n    ],\n];\n```\n\n_Run `bin/popo generate -s tests/fixtures/popo-readme.yml` or `docker-popo generate -s tests/fixtures/popo-readme.yml` to generate files from this example._\n\n\n## Installation\n\n```sh\ncomposer require popo/generator --dev\n```\n\nNote: The installation can be skipped when using docker, see _Docker support_ section.\n\n## Usage\n\nYou can either use it as composer dependency or as docker command.\n\n1. Define schema file, see [tests/fixtures](tests/fixtures/) for examples.\n\n2. Generate POPO files, run:\n   - with composer\n   \n      ```sh\n      vendor/bin/popo generate -s \u003cschema-path\u003e -o \u003coutput-path\u003e\n      ```\n   - with docker\n      ```sh\n      docker-popo generate -s \u003cschema-path\u003e -o \u003coutput-path\u003e     \n     ```\n   \n\n_For example: `bin/popo generate -s tests/fixtures/popo.yml` or `docker-popo generate -s tests/fixtures/popo.yml`._\n\n## POPO Schema\n\nPOPO Schema can be defined and extended on few levels- and it can be defined in multiple files.\n\nThe schema supports key mapping- inheritance- collections and encapsulation of other POPO objects.\n\n\n### Schema Definition\n\n```yaml\n$: # file-config, shared configuration for all POPO objects in current schema file\n  config:\n    namespace: string\n    outputPath: string\n    namespaceRoot: string|null # if set remaps namespace and outputPath\n    extend: string|null # which class POPO objects should extend from\n    implement: string|null # which interface POPO objects should implement\n    comment: string|null # Class docblock comment\n    phpComment: string|null # Generated PHP File docblock comment\n    use: array\u003cstring\u003e|[] # Import block in generated PHP class\n    trait: array\u003cstring\u003e|[] # Traits to be used with generated class\n    attribute: string|null # Class attributes as string\n    attributes: array\u003ckey, value\u003e|[] # Class attributes as key value pairs\n    classPluginCollection: array\u003cstring\u003e|[]\n    phpFilePluginCollection: array\u003cstring\u003e|[]\n    namespacePluginCollection: array\u003cstring\u003e|[]\n    propertyPluginCollection: array\u003cstring\u003e|[]\n    mappingPolicyPluginCollection: array\u003cstring\u003e|[]\n  default: array # default values\n  property: array # shared properties\n\nSchemaName: # schema-config\n  $: # shared configuration for all POPO objects in SchemaName, in all schema files\n    config:\n      namespace: string\n      outputPath: string\n      namespaceRoot: string|null\n      extend: string|null\n      implement: string|null\n      comment: string|null\n      phpComment: string|null\n      use: array\u003cstring\u003e|[]\n      trait: array\u003cstring\u003e|[]\n      attribute: string|null,\n      attributes: array\u003ckey, value\u003e|[]\n      classPluginCollection: array\u003cstring\u003e|[]\n      phpFilePluginCollection: array\u003cstring\u003e|[]\n      namespacePluginCollection: array\u003cstring\u003e|[]\n      propertyPluginCollection: array\u003cstring\u003e|[]\n      mappingPolicyPluginCollection: array\u003cstring\u003e|[]\n    default: array\n    property: [{\n      name: string,\n      type:\n        type: string\n        default: string\n        supportedTypes: ['array','bool','float','int','string','mixed','const','popo', 'datetime'],\n      comment: string|null,\n      default: mixed,\n      itemType: string|null,\n      itemName: string|null,\n      extra: {timezone: ..., format: ...},\n      attribute: string|null,\n      attributes: array\u003ckey, value\u003e|[]\n      mappingPolicy: ['none', 'lower', 'upper', 'camel-to-snake', 'snake-to-camel'],\n      mappingPolicyValue: string|null\n    }]\n\n  PopoName: # popo-config\n    config:\n      namespace: string\n      outputPath: string\n      namespaceRoot: string|null\n      extend: string|null\n      implement: string|null\n      comment: string|null\n      phpComment: string|null\n      use: array\u003cstring\u003e|[]\n      trait: array\u003cstring\u003e|[]\n      attribute: string|null,\n      attributes: array\u003ckey, value\u003e|[]\n      classPluginCollection: array\u003cstring\u003e|[]\n      phpFilePluginCollection: array\u003cstring\u003e|[]\n      namespacePluginCollection: array\u003cstring\u003e|[]\n      propertyPluginCollection: array\u003cstring\u003e|[]\n      mappingPolicyPluginCollection: array\u003cstring\u003e|[]\n    default: array\n    property: [{\n      name: string,\n      type:\n        type: string\n        default: string\n        supportedTypes: ['array','bool','float','int','string','mixed','const','popo', 'datetime'],\n      comment: string|null,\n      default: mixed,\n      itemType: string|null,\n      itemName: string|null,\n      extra: {timezone: ..., format: ...},\n      attribute: string|null,\n      attributes: array\u003ckey, value\u003e|[]\n      mappingPolicy: ['none', 'lower', 'upper', 'camel-to-snake', 'snake-to-camel'],\n      mappingPolicyValue: string|null\n    }]\n```\n\n\n### Schema configuration options\n\n#### `namespace`\n\nDefines generated class namespace.\n\n```yaml\nconfig:\n  namespace: App\\Example\n  ...\n```\n\n#### `outputPath`\n\nDefines output directory.\n\n```yaml\nconfig:\n  outputPath: src/\n  ...\n```\n\n#### `namespaceRoot`\n\nDefines the begging of `outputPath` that should be removed.\nFor example to generated files under `src/Example` with `App\\Example` namespace.\n\n```yaml\nconfig:\n  namespace: App\\Example\n  outputPath: src/\n  namespaceRoot: App\\\n  ...\n```\n\n#### `extend`\n\nWhich class should the generated class extend from. Must start with **\\\\** or contain `::class`.\n\n```yaml\nconfig:\n  extend: \\App\\Example\\AbstractDto::class\n  ...\n```\n\n#### `implement`\n\nWhich interface should the generated class implement. Must start with **\\\\** or contain `::class`.\n\n```yaml\nconfig:\n  implement: \\App\\Example\\DtoInterface::class\n   ...\n```\n\n\n#### `comment`\n\nClass comment.\n\n```yaml\nconfig:\n  comment: |\n    @Document(collection=\"events\")\n...\n```\n\n#### `phpComment`\n\nGenerated PHP file comment.\n\n```yaml\nconfig:\n  phpComment: |\n    Auto generated.\n    @SuppressWarnings(PHPMD)\n    @phpcs:ignoreFile\n...\n```\n\n#### `use`\n\nImport statements.\n\n```yaml\n  config:\n    use:\n      - Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\Document\n      - Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\Field\n      - Doctrine\\ODM\\MongoDB\\Mapping\\Annotations\\Id\n    ...\n```\n\n#### `trait`\n\nTraits statements.\n\n```yaml\n  config:\n    trait:\n      - App\\Example\\MyTrait\n    ...\n```\n\n#### `attribute`\n\nClass attributes value.\n\n```yaml\n  config:\n    attribute: |\n      #[Doctrine\\ORM\\Mapping\\Entity(repositoryClass: LogEventRepository::class)]\n    ...\n```\n\n\n#### `attributes`: `array`\n\nAttribute value as collection. Supported values:\n\n- `name`\n- `value`: `mixed`\n\n\n```yaml\n  config:\n    attributes:\n      - name: Doctrine\\ORM\\Mapping\\Entity\n        value: {repositoryClass: LogEventRepository::class}\n    ...\n```\n\n#### `classPluginCollection`: `array`\n\nAdditional plugins used to generate methods.\n\n```yaml\n  config:\n    classPluginCollection:\n      - \\App\\Plugin\\ExampleMethodPopoPlugin::class\n    ...\n```\n\n#### `namespacePluginCollection`: `array`\n\nAdditional plugins used to generate namespace block.\n\n```yaml\n  config:\n    namespacePluginCollection:\n      - \\App\\Plugin\\ExampleNamespacePopoPlugin::class\n    ...\n```\n\n\n#### `propertyPluginCollection`: `array`\n\nAdditional plugins used to generate properties.\n\n```yaml\n  config:\n    propertyPluginCollection:\n      - \\App\\Plugin\\ExamplePropertyPopoPlugin::class\n    ...\n```\n\n\n#### `mappingPolicyPluginCollection`: `array`\n\nSet of plugins used to map property names, e.g. `fooId` =\u003e `FOO_ID`.\n\n```yaml\n  config:\n    mappingPolicyPluginCollection:\n      - \\App\\Plugin\\SpecialCaseMappingPopoPlugin::class\n    ...\n```\n\n\n### Property configuration options\n\n#### `name`\n    \nThe name of the property. The property related methods will be generated based on this value. For example `getFooBar()`.\nThis is required parameter.\n\n```yaml\nproperty: \n  - name: title\n    ...\n```\n\n\n#### `type`\n\nProperty data type, supported are:\n\n- `array`\n- `bool`\n- `float`\n- `int`\n- `string`\n- `mixed`\n- `const`\n- `popo`\n- `datetime`\n  \nDefault property type is `string`.\n\n```yaml\nproperty: \n  - name: precision\n    type: float\n    ...\n```\n\n#### `comment`\n\nDocblock value for property and methods.\n\n```yaml\nproperty: \n  - name: title\n    comment: Lorem ipsum\n    ...\n```\n\n#### `default: mixed`\n\nDefault value.\n\n```yaml\nproperty: \n  - name: items\n    default: \\App\\ExampleInterface::TEST_BUZZ\n    ...\n```\n\n#### `extra: array`\n\nUsed by `datetime` data type. Supported values:\n\n  - `format`\n  - `timezone`\n\n```yaml\nproperty: \n    - name: created\n      type: datetime\n      extra: \n          timezone: Europe/Paris\n          format: D, d M y H:i:s O\n    ...\n```\n\n#### `itemType`\n\nUsed by `array` data type together with `itemName` element. Describes type of single array element.\n\n```yaml\nproperty:\n    - name: products\n      type: array\n      itemType: Product::class\n    ...\n```\n\n#### `itemName`\n\nUsed by `array` data type. Describes name of single array element. For example: `setProducts(array $products)`, `addProduct(Product $item)`.\n\n```yaml\nproperty:\n    - name: products\n      type: array\n      itemName: product\n    ...\n```\n\n#### `attribute`\n\nAttribute value.\n\n```yaml\nproperty:\n    - name: price\n      attribute: |\n      #[Doctrine\\ORM\\Mapping\\Column(type: Types::INTEGER)]\n    ...\n```\n\n\n#### `attributes`: `array`\n\nAttribute value as collection. Supported values:\n\n- `name`\n- `value`: `mixed`\n\n\n```yaml\nproperty:\n    - name: id\n      attributes:\n        - name: Doctrine\\ORM\\Mapping\\Column\n          value: ['length: 255']\n    ...\n```\n\n\n#### `mappingPolicy: array`\n\nDynamically remaps property names, for example, `fooId` =\u003e `FOO_ID`. Supported values:\n\n- `none`\n- `lower`\n- `upper`\n- `camel-to-snake`\n- `snake-to-camel`\n\n```yaml\nproperty:\n  - name: fooId\n    mappingPolicy:\n      - camel-to-snake\n      - upper\n    ...\n```\n\n#### `mappingPolicyValue`\n\nStatically remaps property names, for example, `fooId` =\u003e `FOO_ID`.\n\n```yaml\nproperty:\n  - name: fooId\n    mappingPolicyValue: FOO_ID\n  ...\n```\n\n\n\n### Schema Inheritance\n\nThe `popo-config` values override `schema-file-config` values- and `schema-file-config` values overwrite `schema-config` values.\n\nOn top of that there is a `global-config` that is defined when using `--schemaConfigFilename` parameter.\n\n\u003cimg src=\"doc/popo_schema.png\" width=\"400\" alt=\"POPO Schema\" /\u003e\n\n#### `schema-config`\n\nThe configuration was defined as a `Schema` property.\nIt will be used by **_all_** POPO objects in **_all_** files under given schema.\n\n\n#### `schema-file-config`\n\nThe configuration was defined as a `SchemaFile` property.\nIt will be used by **_all_** POPO objects in **_current_** file.\n\n\n#### `popo-config`\n\nThe configuration was defined as a `POPO` property.\nIt will be used by one **_specific_** POPO objects in **_current_** file.\n\n\nSee [tests/fixtures](tests/fixtures/) for schema examples.\n\n\n## Property name remapping\n\nPOPO can remap property keys names, for example change `foo_id` into `fooId`.\n\nSee [Property Name Remapping](README_PROPERTY_NAME_REMAPPING.md) doc.\n\n\n## Pluggable architecture\n\nNew functionality can be provided on the command line, or via configuration.\n\nSee [Plugins](README_PLUGINS.md) doc.\n\n\n## Doctrine Support\n\nSee [Doctrine Support](README_DOCTRINE.md) doc.\n\n\n## Command line options\n\nSee [Command Line Options](README_COMMAND_LINE.md) doc.\n\n\n\n## More Examples\n\nSee [fixtures](tests/fixtures/popo.yml) and [tests](tests/suite/App/PopoTest.php) for more usage examples.\n\n## Composer script\n\nAdd popo scrip to composer and run `composer popo` in a project.\n\n```\n    \"scripts\": {\n        \"popo\": [\n            \"bin/popo generate -s \u003cschema-path\u003e\"\n        ]\n    },\n    \"scripts-descriptions\": {\n        \"popo\": \"Generate POPO files\"\n    }\n```\n\n## Docker support\n\nWith docker you can generate files without installing `POPO` as dependency in the project.\n\n```\ndocker container run -it --rm oliwierptak/popo /app/bin/popo\n```\n\nYou can either run the command directly, or create an alias, e.g.:\n\n```\nalias docker-popo='docker container run -it --rm oliwierptak/popo /app/bin/popo ${@}'\n```\n\nFor example:\n\n```\ndocker-popo generate -s tests/fixtures/popo.yml\ndocker-popo report -s tests/fixtures/popo.yml\n``` \n\nSee also: [bin/docker-popo](bin/docker-popo).\n\n\n## PHP version compatibility\n\n- POPO `v1.x` - PHP 7.2+\n- POPO `v2.x` - PHP 7.2+\n- POPO `v3.x` - PHP 7.4+\n- POPO `v4.x` - PHP 7.4+\n- POPO `v5.x` - PHP 7.4+\n- POPO `v6.x` - PHP 8+\n\n\n## POPO schema example\n\nSchema example that produces generated [PopoConfigurator](src/Popo/PopoConfigurator.php) class. \n\n```yaml\n$:\n  config:\n    namespace: Popo\n    outputPath: src/\n    phpComment: |\n      @SuppressWarnings(PHPMD)\n      @phpcs:ignoreFile\n\nPopo:\n  PopoConfigurator:\n    default:\n      phpFilePluginCollection:\n        - \\Popo\\Plugin\\PhpFilePlugin\\StrictTypesPhpFilePlugin::class\n        - \\Popo\\Plugin\\PhpFilePlugin\\CommentPhpFilePlugin::class\n      namespacePluginCollection:\n        - \\Popo\\Plugin\\NamespacePlugin\\UseStatementPlugin::class\n      classPluginCollection:\n        - \\Popo\\Plugin\\ClassPlugin\\ClassAttributePlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ClassCommentPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ConstPropertyClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\DateTimeMethodClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ExtendClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ImplementClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\IsNewClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ListModifiedPropertiesClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\MetadataClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ModifiedToArrayClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\PopoMethodClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\RequireAllClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\UpdateMapClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\FromArrayClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\FromMappedArrayClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ToArrayClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\ToMappedArrayClassPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\MappingPolicyMethod\\ToArrayLowercasePlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\MappingPolicyMethod\\ToArrayUppercasePlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\MappingPolicyMethod\\ToArraySnakeToCamelPlugin::class\n        - \\Popo\\Plugin\\ClassPlugin\\MappingPolicyMethod\\ToArrayCamelToSnakePlugin::class\n      propertyPluginCollection:\n        - \\Popo\\Plugin\\PropertyPlugin\\AddItemPropertyMethodPlugin::class\n        - \\Popo\\Plugin\\PropertyPlugin\\DefinePropertyPlugin::class\n        - \\Popo\\Plugin\\PropertyPlugin\\GetPropertyMethodPlugin::class\n        - \\Popo\\Plugin\\PropertyPlugin\\HasPropertyMethodPlugin::class\n        - \\Popo\\Plugin\\PropertyPlugin\\RequirePropertyMethodPlugin::class\n        - \\Popo\\Plugin\\PropertyPlugin\\SetPropertyMethodPlugin::class\n      mappingPolicyPluginCollection:\n        none: \\Popo\\Plugin\\MappingPolicy\\NoneMappingPolicyPlugin::class\n        lower: \\Popo\\Plugin\\MappingPolicy\\LowerMappingPolicyPlugin::class\n        upper: \\Popo\\Plugin\\MappingPolicy\\UpperMappingPolicyPlugin::class\n        snake-to-camel: \\Popo\\Plugin\\MappingPolicy\\SnakeToCamelMappingPolicyPlugin::class\n        camel-to-snake: \\Popo\\Plugin\\MappingPolicy\\CamelToSnakeMappingPolicyPlugin::class\n    property: [\n      {name: schemaPath}\n      {name: namespace}\n      {name: namespaceRoot}\n      {name: outputPath}\n      {name: phpFilePluginCollection, type: array, itemType: string, itemName: phpFilePluginClass}\n      {name: namespacePluginCollection, type: array, itemType: string, itemName: namespacePluginClass}\n      {name: classPluginCollection, type: array, itemType: string, itemName: classPluginClass}\n      {name: propertyPluginCollection, type: array, itemType: string, itemName: propertyPluginClass}\n      {name: mappingPolicyPluginCollection, type: array, itemType: string, itemName: mappingPolicyPluginClass}\n      {name: schemaConfigFilename}\n      {name: schemaPathFilter}\n      {name: schemaFilenameMask, default: '*.popo.yml'}\n      {name: shouldIgnoreNonExistingSchemaFolder, type: bool}\n    ]}}\n```\n\n[link-packagist]: https://packagist.org/packages/popo/generator\n[link-travis]: https://travis-ci.org/popo/generator\n[link-author]: https://github.com/oliwierptak/popo","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foliwierptak%2Fpopo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foliwierptak%2Fpopo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foliwierptak%2Fpopo/lists"}