diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..f1c2db0
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+root = true
+
+[*]
+indent_style = tab
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.py]
+indent_style = space
+indent_size = 4
+
+[*.{yml,yaml}]
+indent_style = space
+indent_size = 2
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..cfa24c6
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,18 @@
+/.build export-ignore
+/.github export-ignore
+/.phan export-ignore
+/.phpdoc export-ignore
+/docs export-ignore
+/examples export-ignore
+/tests export-ignore
+/.editorconfig export-ignore
+/.gitattributes export-ignore
+/.gitignore export-ignore
+/.readthedocs.yml export-ignore
+/composer.lock export-ignore
+/phpcs.xml.dist export-ignore
+/phpdoc.xml.dist export-ignore
+/phpmd.xml.dist export-ignore
+/phpunit.xml.dist export-ignore
+
+*.php diff=php
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..fc89a67
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+ko_fi: codemasher
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..d4d5471
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,51 @@
+---
+name: Bug report
+about: You have found a bug? Does the library not behave as expected? That's great (ok, not that great)! Please help us to improve!
+title: '[BUG]'
+labels: 'bug'
+---
+
+
+
+**Describe the bug or unexpected behaviour**
+
+A clear and concise description of what the bug is.
+
+
+**Steps to reproduce the behavior**
+
+- When i do ...
+- The code below ...
+- Error message: ...
+
+
+**Code sample** (if applicable)
+
+```php
+// your code here
+```
+
+
+**Expected behavior**
+
+A clear and concise description of what you expected to happen.
+
+
+**Screenshots**
+
+If applicable, add screenshots to help explain your problem.
+
+
+**Environment (please complete the following information):**
+
+- PHP version/OS: [e.g. 7.4.12, Ubuntu 20.04]
+- Library version: [e.g. 4.3.1]
+
+
+**Additional context**
+
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..1953e4a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: "You have a question or an issue that is not a bug?"
+ about: "Please use the Q&A section under discussions. Thanks!"
+ url: https://github.com/chillerlan/php-library-template/discussions
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..22e8669
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,33 @@
+---
+name: Feature request
+about: You have an idea for a new feature (or improve an existing one)? Great!
+title: '[ENHANCEMENT]'
+labels: 'enhancement'
+---
+
+
+
+**Describe the feature**
+
+A clear and concise description of the requested feature.
+
+
+**Code sample** (if applicable)
+
+```php
+// your code here
+```
+
+
+**Additional context**
+
+Add any other context here (if applicable).
+
+
+**Are you (the requester) willing to submit a pull request for that feature?**
+
+[YES|NO] (A yes will greatly increase the chance that the feature will be added)
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..5b45485
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,33 @@
+## Proposed changes
+
+
+
+
+
+
+## Types of changes
+
+
+
+What types of changes does your code introduce?
+
+- [ ] Bugfix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] Documentation fix or enhancement (no code was touched)
+- [ ] Other (CI, dependencies, etc., please describe)
+
+
+## Checklist:
+
+- [ ] I have checked to ensure there aren't other open [Issues](../../../issues) or [Pull Requests](../../../pulls) for the same update/change
+- [ ] I have added tests that prove my fix is effective or that my feature works
+- [ ] I have added necessary documentation (if appropriate)
+- [ ] Any dependent changes have been merged and published in downstream modules
+- [ ] Static analysis and unit tests pass locally with my changes
+
+
+## Further comments
+
+If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc...
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..3cd3675
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,162 @@
+# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
+# https://github.com/sebastianbergmann/phpunit/blob/main/.github/workflows/ci.yaml
+
+# https://github.com/actions/checkout
+# https://github.com/actions/upload-artifact
+# https://github.com/shivammathur/setup-php
+# https://github.com/ramsey/composer-install
+# https://github.com/codecov/codecov-action
+# https://github.com/codacy/codacy-coverage-reporter-action
+# https://github.com/JamesIves/github-pages-deploy-action
+# https://github.com/stefanzweifel/git-auto-commit-action
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+name: "Continuous Integration"
+
+env:
+ PHP_EXTENSIONS: none
+ PHP_INI_VALUES: memory_limit=-1, error_reporting=-1, display_errors=On
+
+jobs:
+
+ static-code-analysis:
+ name: "Static Code Analysis"
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: true
+ matrix:
+ php-version:
+ - "8.1"
+ - "8.2"
+ - "8.3"
+
+ env:
+ PHAN_ALLOW_XDEBUG: 0
+ PHAN_DISABLE_XDEBUG_WARN: 1
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-version }}
+ extensions: ast, ${{ env.PHP_EXTENSIONS }}
+ ini-values: ${{ env.PHP_INI_VALUES }}
+ coverage: none
+
+ - name: "Update dependencies with composer"
+ uses: ramsey/composer-install@v3
+
+ - name: "Run phan"
+ run: php vendor/bin/phan --target-php-version=${{ matrix.php-version }}
+
+
+ tests:
+ name: "Unit Tests"
+ needs: static-code-analysis
+ runs-on: ${{ matrix.os }}
+
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-latest
+ - windows-latest
+ php-version:
+ - "8.1"
+ - "8.2"
+ - "8.3"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP with extensions"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php-version }}
+ extensions: ${{ env.PHP_EXTENSIONS }}
+ ini-values: ${{ env.PHP_INI_VALUES }}
+ coverage: pcov
+
+ - name: "Install dependencies with composer"
+ uses: ramsey/composer-install@v3
+
+ - name: "Run tests with phpunit"
+ run: php vendor/bin/phpunit --colors=always --configuration=phpunit.xml.dist
+
+ - name: "Send code coverage report to Codecov.io"
+ uses: codecov/codecov-action@v4
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: .build/coverage/clover.xml
+
+ - name: "Send code coverage report to Codacy"
+ uses: codacy/codacy-coverage-reporter-action@v1
+ with:
+ project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
+ coverage-reports: .build/coverage/clover.xml
+
+
+ build-docs:
+ name: "Build and publish API docs"
+ if: github.ref_name == 'main'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: "Checkout sources"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: "8.3"
+ extensions: ${{ env.PHP_EXTENSIONS }}
+ ini-values: ${{ env.PHP_INI_VALUES }}
+ coverage: none
+ tools: phpDocumentor
+
+ - name: "Build API docs"
+ run: phpdoc --config=phpdoc.xml.dist
+
+ - name: "Publish API docs to branch gh-pages"
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: gh-pages
+ folder: .build/phpdocs
+ clean: true
+
+
+ build-manual:
+ name: "Build and publish user manual"
+ if: github.ref_name == 'main'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: "Checkout sources"
+ uses: actions/checkout@v4
+
+ - name: "Install Sphinx"
+ run: pip install sphinx myst-parser sphinx-rtd-theme
+
+ - name: "Build manual"
+ run: |
+ cd docs
+ make html
+
+ - name: "Publish user manual to branch readthedocs"
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: readthedocs
+ folder: .build/sphinx/html
+ clean: true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..84109c7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+# IDE - IntelliJ
+.idea/*
+# Keep the code styles.
+!.idea/codeStyles
+.idea/codeStyles/*
+!.idea/codeStyles/Project.xml
+!.idea/codeStyles/codeStyleConfig.xml
+# Keep the inspection levels
+!.idea/inspectionProfiles
+.idea/inspectionProfiles/*
+!.idea/inspectionProfiles/Project_Default.xml
+
+# project stuff
+.build/*
+vendor/*
+composer.lock
+phpcs.xml
+phpdoc.xml
+phpmd.xml
+phpunit.xml
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..62cae6e
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.phan/config.php b/.phan/config.php
new file mode 100644
index 0000000..b62fe11
--- /dev/null
+++ b/.phan/config.php
@@ -0,0 +1,61 @@
+ null,
+ 'minimum_target_php_version' => '8.1',
+
+ // A list of directories that should be parsed for class and
+ // method information. After excluding the directories
+ // defined in exclude_analysis_directory_list, the remaining
+ // files will be statically analyzed for errors.
+ //
+ // Thus, both first-party and third-party code being used by
+ // your application should be included in this list.
+ 'directory_list' => [
+ '.phan/stubs',
+ 'examples',
+ 'src',
+ 'tests',
+ 'vendor',
+ ],
+
+ // A regex used to match every file name that you want to
+ // exclude from parsing. Actual value will exclude every
+ // "test", "tests", "Test" and "Tests" folders found in
+ // "vendor/" directory.
+ 'exclude_file_regex' => '@^vendor/.*/(tests?|Tests?)/@',
+
+ // A directory list that defines files that will be excluded
+ // from static analysis, but whose class and method
+ // information should be included.
+ //
+ // Generally, you'll want to include the directories for
+ // third-party code (such as "vendor/") in this list.
+ //
+ // n.b.: If you'd like to parse but not analyze 3rd
+ // party code, directories containing that code
+ // should be added to both the `directory_list`
+ // and `exclude_analysis_directory_list` arrays.
+ 'exclude_analysis_directory_list' => [
+ 'vendor/',
+ '.phan/stubs',
+ ],
+ 'suppress_issue_types' => [
+ 'PhanAccessMethodInternal',
+ ],
+];
diff --git a/.phpdoc/template/base.html.twig b/.phpdoc/template/base.html.twig
new file mode 100644
index 0000000..0dc60e2
--- /dev/null
+++ b/.phpdoc/template/base.html.twig
@@ -0,0 +1,12 @@
+{% extends 'layout.html.twig' %}
+
+{%
+ set topMenu = {
+ "menu": [
+ { "name": "User Manual", "url": "https://php-library-template.readthedocs.io"},
+ ],
+ "social": [
+ { "iconClass": "fab fa-github", "url": "https://github.com/chillerlan/php-library-template"},
+ ]
+}
+%}
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 0000000..5533673
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,31 @@
+# Read the Docs configuration file for Sphinx projects
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the OS, Python version and other tools you might need
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.11"
+ # You can also specify other tool versions:
+ # nodejs: "19"
+ # rust: "1.64"
+ # golang: "1.19"
+
+# Build documentation in the "docs/" directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
+
+# Optionally build your docs in additional formats such as PDF and ePub
+# formats:
+# - pdf
+# - epub
+
+# Optional but recommended, declare the Python requirements required
+# to build your documentation
+# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: docs/requirements.txt
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..28dfe7a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2024 smiley
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..d3c8037
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,56 @@
+{
+ "name": "chillerlan/php-library-template",
+ "description": "A PHP Library template/boilerplate.",
+ "license": "MIT",
+ "type": "library",
+ "keywords": ["boilerplate", "library-template"],
+ "authors": [
+ {
+ "name": "smiley",
+ "email": "smiley@chillerlan.net",
+ "homepage": "https://github.com/codemasher"
+ },
+ {
+ "name": "Contributors",
+ "homepage":"https://github.com/chillerlan/php-library-template/graphs/contributors"
+ }
+ ],
+ "homepage": "https://github.com/chillerlan/php-library-template",
+ "support": {
+ "docs": "https://php-library-template.readthedocs.io",
+ "issues": "https://github.com/chillerlan/php-library-template/issues",
+ "source": "https://github.com/chillerlan/php-library-template"
+ },
+ "minimum-stability": "stable",
+ "prefer-stable": true,
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phan/phan": "^5.4",
+ "phpunit/phpunit": "^10.5",
+ "phpmd/phpmd": "^2.15",
+ "squizlabs/php_codesniffer": "^3.9"
+ },
+ "suggest": {
+ },
+ "autoload": {
+ "psr-4": {
+ "chillerlan\\LibraryTemplate\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "chillerlan\\LibraryTemplateTest\\": "tests/"
+ }
+ },
+ "scripts": {
+ "phpunit": "@php vendor/bin/phpunit",
+ "phan": "@php vendor/bin/phan"
+ },
+ "config": {
+ "lock": false,
+ "sort-packages": true,
+ "platform-check": true
+ }
+}
diff --git a/docs/Appendix/Contribute.md b/docs/Appendix/Contribute.md
new file mode 100644
index 0000000..0f00469
--- /dev/null
+++ b/docs/Appendix/Contribute.md
@@ -0,0 +1,67 @@
+# How to contribute
+
+## Questions and issues
+
+If you have a question about or a general issue while using this library,
+head over to the [discussions section](https://github.com/chillerlan/php-library-template/discussions),
+create a new post and describe your issue as precise as possible, ideally add a code example (if applicable).
+Please don't just write "headline says all" because the reply will likely be similarly concise - help me (and others) help you!
+(just to clarify: the "general" does not mean general PHP support, in which case you're better off on
+[StackOverflow](https://stackoverflow.com/questions/tagged/php) or [/r/PHPhelp](https://www.reddit.com/r/PHPhelp/))
+
+
+## Bug reports
+
+So you found a bug or the library code is somehow misbehaving? That's great (well, not that great tho). In that case,
+please [open a bug report and FILL OUT THE ISSUE TEMPLATE](https://github.com/chillerlan/php-library-template/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=%5BBUG%5D)
+(i have to write that in all caps because nobody actually does it which usually leads to several avoidable follow-up questions that cost both of us precious time).
+Below an example of the bug report template (it's not that hard):
+
+**Describe the bug**
+
+A clear and concise description of what the bug is.
+
+**Steps to reproduce the behavior**
+- When i do ...
+- The code below ...
+- Error message: ...
+
+**Code sample**
+```php
+// your code here
+```
+
+**Expected behavior**
+
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+
+If applicable, add screenshots to help explain your problem.
+
+**Environment (please complete the following information):**
+- PHP version/OS: [e.g. 7.4.12, Ubuntu 20.04]
+- Library version: [e.g. 4.0.0]
+
+**Additional context**
+
+Add any other useful context about the problem.
+
+
+## Pull requests and bug fixes
+
+You want to contribute code to fix something or add a feature? Hey that's cool! However, there's a few things to keep in mind:
+
+- Please add a description of what the PR does or fixes and why it should be merged. If you're unsure, [open an issue](https://github.com/chillerlan/php-library-template/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=%5BENHANCEMENT%5D) before to gather feedback.
+- Make sure your branch is up-to-date/even with the upstream branch you're submitting your PR to.
+- Please try to adhere to the [*loosely outlined* coding standards](https://github.com/chillerlan/php-qrcode/discussions/60), or, in case you're using [PHPStorm](https://www.jetbrains.com/phpstorm/), make sure you're using [the supplied IDE profile](https://github.com/chillerlan/php-library-template/tree/main/.idea).
+
+
+## Documentation
+
+The documentation is a work in progress - any suggestion and contribution is very welcome!
+If you have an addition or correction, feel free to open a [documentation issue](https://github.com/chillerlan/php-library-template/issues/new?assignees=&labels=docs&projects=&template=documentation.md&title=%5BDOCS%5D).
+
+
+The API documentation is auto generated with [phpDocumentor](https://www.phpdoc.org/) from the docblocks [in the PHP sources](https://github.com/chillerlan/php-library-template/tree/main/src).
+The markdown sources for the [Read the Docs online manual](https://php-oauth.readthedocs.io) are located in the [/docs directory](https://github.com/chillerlan/php-library-template/tree/main/docs)
diff --git a/docs/Appendix/License.rst b/docs/Appendix/License.rst
new file mode 100644
index 0000000..cef12fc
--- /dev/null
+++ b/docs/Appendix/License.rst
@@ -0,0 +1,443 @@
+*******
+License
+*******
+
+.. code-block:: text
+
+ Copyright (c) 2024 smiley.
+
+ This work is licensed under the Creative Commons
+ Attribution 4.0 International (CC BY 4.0)
+
+ A summary of the license is given below, followed by the full legal
+ text.
+
+ -----------------------------------------------------------------------
+
+ You are free to:
+
+ Share
+
+ - copy and redistribute the material in any medium or format
+
+ Adapt
+
+ - remix, transform, and build upon the material for any purpose,
+ even commercially.
+
+ The licensor cannot revoke these freedoms as long as you follow the
+ license terms.
+
+
+ Under the following terms:
+
+ Attribution
+
+ - You must give appropriate credit, provide a link to the license,
+ and indicate if changes were made.
+
+ - You may do so in any reasonable manner, but not in any way that
+ suggests the licensor endorses you or your use.
+
+ No additional restrictions
+
+ - You may not apply legal terms or technological measures that
+ legally restrict others from doing anything the license permits.
+
+ -----------------------------------------------------------------------
+
+ Attribution 4.0 International
+
+ =======================================================================
+
+ Creative Commons Corporation ("Creative Commons") is not a law firm and
+ does not provide legal services or legal advice. Distribution of
+ Creative Commons public licenses does not create a lawyer-client or
+ other relationship. Creative Commons makes its licenses and related
+ information available on an "as-is" basis. Creative Commons gives no
+ warranties regarding its licenses, any material licensed under their
+ terms and conditions, or any related information. Creative Commons
+ disclaims all liability for damages resulting from their use to the
+ fullest extent possible.
+
+ Using Creative Commons Public Licenses
+
+ Creative Commons public licenses provide a standard set of terms and
+ conditions that creators and other rights holders may use to share
+ original works of authorship and other material subject to copyright
+ and certain other rights specified in the public license below. The
+ following considerations are for informational purposes only, are not
+ exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+ =======================================================================
+
+ Creative Commons Attribution 4.0 International Public License
+
+ By exercising the Licensed Rights (defined below), You accept and agree
+ to be bound by the terms and conditions of this Creative Commons
+ Attribution 4.0 International Public License ("Public License"). To the
+ extent this Public License may be interpreted as a contract, You are
+ granted the Licensed Rights in consideration of Your acceptance of
+ these terms and conditions, and the Licensor grants You such rights in
+ consideration of benefits the Licensor receives from making the
+ Licensed Material available under these terms and conditions.
+
+
+ Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+ Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+ Section 3 -- License Conditions.
+
+ Your exercise of the Licensed Rights is expressly made subject to the
+ following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+ Section 4 -- Sui Generis Database Rights.
+
+ Where the Licensed Rights include Sui Generis Database Rights that
+ apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+ For the avoidance of doubt, this Section 4 supplements and does not
+ replace Your obligations under this Public License where the Licensed
+ Rights include other Copyright and Similar Rights.
+
+
+ Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+ Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+ Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+ Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+ =======================================================================
+
+ Creative Commons is not a party to its public
+ licenses. Notwithstanding, Creative Commons may elect to apply one of
+ its public licenses to material it publishes and in those instances
+ will be considered the “Licensor.” The text of the Creative Commons
+ public licenses is dedicated to the public domain under the CC0 Public
+ Domain Dedication. Except for the limited purpose of indicating that
+ material is shared under a Creative Commons public license or as
+ otherwise permitted by the Creative Commons policies published at
+ creativecommons.org/policies, Creative Commons does not authorize the
+ use of the trademark "Creative Commons" or any other trademark or logo
+ of Creative Commons without its prior written consent including,
+ without limitation, in connection with any unauthorized modifications
+ to any of its public licenses or any other arrangements,
+ understandings, or agreements concerning use of licensed material. For
+ the avoidance of doubt, this paragraph does not form part of the
+ public licenses.
+
+ Creative Commons may be contacted at creativecommons.org.
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000..4bbaa7d
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = .
+BUILDDIR = ../.build/sphinx
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/Usage/Installation.md b/docs/Usage/Installation.md
new file mode 100644
index 0000000..44e5e7e
--- /dev/null
+++ b/docs/Usage/Installation.md
@@ -0,0 +1,61 @@
+# Installation
+
+## Installation with Composer
+
+**[Composer](https://getcomposer.org) is required to install this package.**
+
+
+### composer.json
+
+Installation via [`composer.json`](https://getcomposer.org/doc/04-schema.md):
+
+```json
+{
+ "require": {
+ "php": "^8.1",
+ "chillerlan/php-library-template": "dev-main"
+ }
+}
+```
+
+Note: replace `dev-main` with a [version constraint](https://getcomposer.org/doc/articles/versions.md#writing-version-constraints), e.g. `^1.0` - see [releases](https://github.com/chillerlan/php-library-template/releases) for valid versions.
+In case you want to keep using `dev-main`, specify the hash of a commit to avoid running into unforseen issues, like so: `dev-main#cb69751c3bc090a7fdd2f2601bbe10f28d225f10`
+
+
+### Terminal
+
+To install `php-library-template` on the terminal, use:
+
+```shell
+composer require chillerlan/php-library-template
+```
+
+If you want to install the package from a specific tag or commit, do as follows:
+
+```shell
+composer require chillerlan/php-library-template:1.0.0
+composer require chillerlan/php-library-template:dev-main#f15b0afe9d4128bf734c3bf1bcffae72bf7b3e53
+```
+
+
+## Manual installation
+
+Download the desired version of the package from [main](https://github.com/chillerlan/php-library-template/archive/refs/heads/main.zip) or
+[release](https://github.com/chillerlan/php-library-template/releases) and extract the contents to your project folder.
+After that, run `composer install` in the package root directory to install the required dependencies and generate `./vendor/autoload.php`.
+
+Profit!
+
+
+### Can i use this library without using composer?
+
+You can, but it's absolutely not recommended, nor supported.
+
+With that said, I'll leave you with this info:
+
+- download the .zip for a version of your choice and also all required dependencies listed in the `composer.json` for that version (you can find links to the respective repos [on packagist](https://packagist.org/packages/chillerlan/php-library-template))
+- extract the files into your library folder
+- include the files manually or with whatever autoloader you are using
+
+Good luck!
+
diff --git a/docs/Usage/Overview.md b/docs/Usage/Overview.md
new file mode 100644
index 0000000..44e165b
--- /dev/null
+++ b/docs/Usage/Overview.md
@@ -0,0 +1,9 @@
+# Overview
+
+
+## Features
+
+
+## Requirements
+
+- PHP 8.1+
diff --git a/docs/Usage/Quickstart.md b/docs/Usage/Quickstart.md
new file mode 100644
index 0000000..79ba12c
--- /dev/null
+++ b/docs/Usage/Quickstart.md
@@ -0,0 +1,18 @@
+# Quickstart
+
+## Import the library
+
+Import the main class(es) and include the autoloader (if necessary):
+```php
+use chillerlan\LibraryTemplate\Example;
+
+require_once __DIR__.'/../vendor/autoload.php';
+```
+
+## Run
+
+```php
+$example = new Example;
+
+echo $example->hello(); // -> hi
+```
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000..c218e59
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,245 @@
+# -*- coding: utf-8 -*-
+#
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# ----------------------------------------------------------------------------
+
+import os
+import platform
+import re
+import shlex
+import sys
+from subprocess import Popen, PIPE
+
+def get_version():
+ if os.environ.get('READTHEDOCS') == 'True':
+ return os.environ.get('READTHEDOCS_VERSION')
+
+ if os.environ.get('GITHUB_ACTIONS') == 'True':
+ return os.environ.get('GITHUB_REF_NAME')
+
+ grep = 'git branch | findstr \*' if platform.system() == 'Windows' else 'git branch | grep \*'
+ pipe = Popen(grep, stdout=PIPE, shell=True, universal_newlines=True)
+ version = pipe.stdout.read()
+
+ if version:
+ return version[2:]
+ else:
+ return 'unknown'
+
+# ----------------------------------------------------------------------------
+
+# loading PhpLexer
+from sphinx.highlighting import lexers
+from pygments.lexers.web import PhpLexer
+
+# enable highlighting for PHP code not between ```` by default
+lexers['php'] = PhpLexer(startinline=True)
+lexers['php-annotations'] = PhpLexer(startinline=True)
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = u'PHP Library template'
+copyright = u'2024, smiley'
+author = u'smiley'
+epub_author = u'smiley'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = get_version().strip()
+
+# The full version, including alpha/beta/rc tags.
+release = version
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+# If your documentation needs a minimal Sphinx version, state it here.
+needs_sphinx = '6.0.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'myst_parser',
+ 'sphinx.ext.autodoc',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+#templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+source_suffix = ['.rst', '.md']
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = 'en'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build', 'Readme.md']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The default language to highlight source code in. The default is 'default'.
+# It is similar to 'python3'; it is mostly a superset of 'python' but it
+# fallbacks to 'none' without warning if failed.
+highlight_language = 'none'
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_theme = 'sphinx_rtd_theme'
+html_theme_options = {
+ 'collapse_navigation': False,
+ 'display_version': False
+}
+
+html_context = {
+ 'display_github': True,
+ 'github_user': 'chillerlan',
+ 'github_repo': 'php-oauth-core',
+ 'github_version': version,
+ 'conf_py_path': '/docs/',
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = ['_templates']
+
+#html_add_permalinks = ''
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+html_title = "PHP-QRCode %s Manual" % get_version()
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+#html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+html_show_sphinx = False
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+#htmlhelp_basename = ''
+
+# https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html#handling-invalid-references
+suppress_warnings = ["myst.xref_missing"]
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000..40c3af5
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,25 @@
+.. php-library-template documentation master file, created by sphinx-quickstart on Sun Jul 9 21:45:56 2023.
+ markdown-rst converter: https://pandoc.org/try/
+
+================
+PHP-OAuth Manual
+================
+
+User manual for `chillerlan/php-library-template `__ [|version|]. Updated on |today|.
+
+This work is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License.
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Usage
+
+ Usage/Overview.md
+ Usage/Installation.md
+
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Appendix
+
+ Appendix/Contribute.md
+ Appendix/License.md
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000..0fc6d0b
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,36 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+
+set SOURCEDIR=.
+set BUILDDIR=../.build/sphinx
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..eb89c12
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,3 @@
+myst-parser>=2.0.0
+Sphinx==6.0.0
+sphinx_rtd_theme>=1.2.1
diff --git a/examples/example.php b/examples/example.php
new file mode 100644
index 0000000..38e2b1d
--- /dev/null
+++ b/examples/example.php
@@ -0,0 +1,16 @@
+
+ * @copyright 2024 smiley
+ * @license MIT
+ */
+declare(strict_types=1);
+
+require_once __DIR__.'/../vendor/autoload.php';
+
+$example = new \chillerlan\LibraryTemplate\Example;
+
+echo $example->hello();
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
new file mode 100644
index 0000000..75125bf
--- /dev/null
+++ b/phpcs.xml.dist
@@ -0,0 +1,191 @@
+
+
+ chillerlan rules for phpcs
+
+ examples
+ src
+ tests
+
+
+
+
+
+ error
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ error
+
+
+
+ error
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ examples
+
+
+
+ examples
+
+
+
+ examples
+
+
+
+ examples
+
+
+
+ examples
+
+
+
diff --git a/phpdoc.xml.dist b/phpdoc.xml.dist
new file mode 100644
index 0000000..c8f1cd9
--- /dev/null
+++ b/phpdoc.xml.dist
@@ -0,0 +1,25 @@
+
+
+
+
+
+ .build/phpdocs-cache
+
+
+
+
+ src
+ tests
+
+
+ php
+
+
+
+
+
+
diff --git a/phpmd.xml.dist b/phpmd.xml.dist
new file mode 100644
index 0000000..a447d07
--- /dev/null
+++ b/phpmd.xml.dist
@@ -0,0 +1,45 @@
+
+
+
+ codemasher/chillerlan PMD ruleset
+ */examples/*
+ */vendor/*
+ */tests/*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 0000000..647daf9
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,24 @@
+
+
+
+
+ ./tests/
+
+
+
+
+ src
+
+
+
+
+
+
+
+
+
diff --git a/src/Example.php b/src/Example.php
new file mode 100644
index 0000000..a7fdf20
--- /dev/null
+++ b/src/Example.php
@@ -0,0 +1,23 @@
+
+ * @copyright 2024 smiley
+ * @license MIT
+ */
+declare(strict_types=1);
+
+namespace chillerlan\LibraryTemplate;
+
+/**
+ *
+ */
+class Example{
+
+ public function hello():string{
+ return 'hi';
+ }
+
+}
diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php
new file mode 100644
index 0000000..c20dff9
--- /dev/null
+++ b/tests/ExampleTest.php
@@ -0,0 +1,28 @@
+
+ * @copyright 2024 smiley
+ * @license MIT
+ */
+declare(strict_types=1);
+
+namespace chillerlan\LibraryTemplateTest;
+
+use chillerlan\LibraryTemplate\Example;
+use PHPUnit\Framework\TestCase;
+
+/**
+ *
+ */
+class ExampleTest extends TestCase{
+
+ public function testInstance():void{
+ $obj = new Example;
+
+ $this::assertInstanceOf(Example::class, $obj);
+ }
+
+}